2017-02-15 59 views
2

這裏是我的代碼:「語法錯誤」,並稱用ALTER TABLE一個YY-MM-DD列時

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'」

添加列的語法與其他變量正常工作。它只是沒有與日期一起工作。我甚至把日期作爲一個字符串,但由於某種原因沒有解決它。

+0

是否確定要創建名爲17-02-14的列?或者列名應該是'timestamp'還是別的?這個錯誤是因爲SQL表名不能在原地有正確的轉義字符的連字符(除非你絕對需要它,否則就會引發麻煩)。 – Sharad

+0

啊,我不知道。我希望列標題成爲日期,以便將來可以參考它。什麼是這樣做的好方法? – user3364161

+0

您可以使用下劃線代替連字符。或者,對列名使用yyyymmdd格式。 – Sharad

回答

2

您試圖創建一個名稱類似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可能對列名,如其他限制,有些人可能會堅持認爲,列名開始用數字。

+0

太棒了。我曾嘗試過使用「和」,但從未使用方括號。這工作完美。 – user3364161