【问题标题】:"Incorrect syntax" when adding a yy-mm-dd column with ALTER TABLE使用 ALTER TABLE 添加 yy-mm-dd 列时出现“语法错误”
【发布时间】:2017-02-15 03:50:03
【问题描述】:

这是我的代码:

val = str(datetime.datetime.now().strftime("%y-%m-%d"))
print(val)

def export():
    cursor = conn.cursor()
    cursor.execute("ALTER TABLE TRACKER ADD %s INTEGER" % val)

    conn.commit()

当我运行代码时,它会打印“17-02-14”,但是当我点击导出按钮时,我收到错误“'17' 附近的语法不正确”

添加列的语法与其他变量一起工作正常。它只是不适用于日期。我什至将日期转换为字符串,但由于某种原因没有修复它。

【问题讨论】:

  • 您确定要创建一个名为 17-02-14 的列吗?或者列名应该是“时间戳”或类似的东西?该错误是因为 SQL 表名不能在适当的位置包含带有正确转义字符的连字符(除非您绝对需要它,否则这会带来麻烦)。
  • 啊,我不知道。我希望列标题是日期,以便将来可以参考。这样做的好方法是什么?
  • 您可以使用下划线代替连字符。或者,使用 yyyymmdd 格式作为列名。
  • 将列标题设为特定日期的用例是什么。我还没有看到任何这样设计的数据库模式,因为每 24 小时你就会有一个新的日期,而且你的表会在短时间内用完列。 (或至少变得无法管理)。我建议在数据库表中添加一个“日期”列并针对它添加行。如果您的列数不同,像 MongoDB 这样的 NOSQL 数据库也可能是一个不错的选择。
  • 列名本身应该是一个字符串(它是一个名称)。猜猜使用全整数列名可能会有限制。 1. 你可以尝试添加一个字母作为前缀 - 比如 d_20141217? 2. 列名可以用双引号“20141217”括起来吗?

标签: python sql pyodbc


【解决方案1】:

您试图创建一个名称类似于 17-02-15 的列,但您没有成功,因为需要引用包含空格或“有趣字符”的列名。以下示例使用接受 ANSI 标准双引号 ("column name") 的 SQLite,但其他 DBMS 可能使用其他字符,例如 MySQL 倾向于使用反引号 (`column name`),Microsoft SQL Server 通常使用方括号 (@987654324 @)。

测试代码:

import datetime
import sqlite3

conn = sqlite3.connect(':memory:')
crsr = conn.cursor()

sql = 'CREATE TABLE TRACKER (id INT PRIMARY KEY)'
print(sql)
crsr.execute(sql)
conn.commit()
print("Test table created.")
print("")

val = str(datetime.datetime.now().strftime("%y-%m-%d"))

sql = 'ALTER TABLE TRACKER ADD %s INTEGER' % val
print(sql)
try:
    crsr.execute(sql)
    conn.commit()
    print("Column added.")
except Exception as ex:
    print(repr(ex))
print("")

# now try with quotes around the column name
sql = 'ALTER TABLE TRACKER ADD "%s" INTEGER' % val
print(sql)
try:
    crsr.execute(sql)
    conn.commit()
    print("Column added.")
except Exception as ex:
    print(repr(ex))
print("")

sql = 'SELECT * FROM TRACKER'
crsr.execute(sql)
print("Current column names:")
print([x[0] for x in crsr.description])

crsr.close()
conn.close()

控制台输出:

CREATE TABLE TRACKER (id INT PRIMARY KEY)
Test table created.

ALTER TABLE TRACKER ADD 17-02-15 INTEGER
OperationalError('near "17": syntax error',)

ALTER TABLE TRACKER ADD "17-02-15" INTEGER
Column added.

Current column names:
['id', '17-02-15']

另请注意,不同的 DBMS 可能对列名有其他限制,例如,有些人可能坚持列名以数字开头。

【讨论】:

  • 太棒了。我曾尝试使用 `` 和 "" 但从未使用方括号。这非常有效。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
相关资源
最近更新 更多