您試圖創建一個名稱類似17-02-15
的列,但由於需要引用包含空格或「有趣的字符」的列名,所以您不成功。以下示例使用接受ANSI標準雙引號("column name"
)的SQLite,但其他DBMS可能使用其他字符,例如,MySQL傾向於使用反引號(`column name`
),Microsoft SQL Server通常使用方括號([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可能對列名,如其他限制,有些人可能會堅持認爲,列名不開始用數字。
是否確定要創建名爲17-02-14的列?或者列名應該是'timestamp'還是別的?這個錯誤是因爲SQL表名不能在原地有正確的轉義字符的連字符(除非你絕對需要它,否則就會引發麻煩)。 – Sharad
啊,我不知道。我希望列標題成爲日期,以便將來可以參考它。什麼是這樣做的好方法? – user3364161
您可以使用下劃線代替連字符。或者,對列名使用yyyymmdd格式。 – Sharad