"Incorrect syntax" 使用 ALTER 添加 yy-mm-dd 列时 TABLE
"Incorrect syntax" when adding a yy-mm-dd column with ALTER TABLE
这是我的代码:
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”,但是当我点击导出按钮时,出现错误 "Incorrect syntax near '17'"
添加列的语法与其他变量一起工作正常。它只是不适用于日期。我什至将日期转换为字符串,但由于某种原因没有修复它。
您试图创建一个名称类似于 17-02-15
的列,但没有成功,因为包含空格或 "funny characters" 的列名需要用引号引起来。以下示例使用 SQLite,它接受 ANSI 标准 double-quote ("column name"
),但其他 DBMS 可能使用其他字符,例如,MySQL 倾向于使用反引号 (`column name`
) 和 Microsoft SQL 服务器通常使用方括号 ([column name]
).
测试代码:
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 可能对列名有其他限制,例如,有些人可能坚持列名不能以数字开头。
这是我的代码:
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”,但是当我点击导出按钮时,出现错误 "Incorrect syntax near '17'"
添加列的语法与其他变量一起工作正常。它只是不适用于日期。我什至将日期转换为字符串,但由于某种原因没有修复它。
您试图创建一个名称类似于 17-02-15
的列,但没有成功,因为包含空格或 "funny characters" 的列名需要用引号引起来。以下示例使用 SQLite,它接受 ANSI 标准 double-quote ("column name"
),但其他 DBMS 可能使用其他字符,例如,MySQL 倾向于使用反引号 (`column name`
) 和 Microsoft SQL 服务器通常使用方括号 ([column name]
).
测试代码:
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 可能对列名有其他限制,例如,有些人可能坚持列名不能以数字开头。