"语法错误"使用ALTER TABLE添加yy-mm-dd列时

时间:2017-02-15 03:50:04

标签: python sql pyodbc

这是我的代码:

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;''"

附近的语法不正确

添加列的语法与其他变量一起正常工作。它只是不与日期一起工作。我甚至把日期作为一个字符串,但由于某种原因没有解决它。

1 个答案:

答案 0 :(得分:2)

您尝试创建名称为17-02-15的列,但由于需要引用包含空格或“有趣字符”的列名,因此您无法成功。以下示例使用接受ANSI标准双引号("column name")的SQLite,但其他DBMS可能使用其他字符,例如,MySQL倾向于使用反引号(`column name`)而Microsoft SQL Server通常使用square括号([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可能对列名称有其他限制,例如,有些人可能会坚持列名以数字开头。