2017-10-05 95 views
0

我是編程新手。我有dictionary稱爲記錄,它接收各種輸入,如'顏色','類型''數量'等。現在我試着添加一個日期列,然後插入到sqlite表中,通過下面的代碼運行'if循環'。但是我收到了「2017年附近的操作錯誤」,即接近日期。Python sqlite3 - 在「2017」附近的operationalerror

任何人都可以幫忙嗎?在此先感謝

Date = str(datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d')) 

record['Date'] = Date 

column = [record['Color'], Date] 

values = [record['quantity'], record['Date']] 

column = ','.join(column) 

if record['Type'] == 'T-Shirts' and record['Style'] == 'Soft': 

    stment = ("INSERT INTO xtrasmall (%s) values(?)" %column) 
    c.execute(stment, values) 
    conn.commit() 
+0

請參閱http://www.sqlite.org/datatype3.html#datetime。 –

回答

0

更新

您可以簡化代碼如下:

from datetime import datetime 

date = datetime.now().date() 
sql = "INSERT INTO xtrasmall (%s, Date) values (?, ?)" % record['Color'] 
c.execute(sql, (record['quantity'], date)) 

這個替換所選顏色的值直接進入查詢字符串的列名。然後執行查詢將數量和日期字符串作爲參數傳遞。日期應自動轉換爲字符串,但如果需要,可以使用str()進行轉換。

這確實假設其他顏色列有一個默認值(大概爲0),或允許空值。


原來的答覆

因爲你是用繩子插構建查詢(即一個字符串替換%s)您的發言變得像這樣:

INSERT INTO xtrasmall (Red,2017-10-06) values(?) 

這是無效的因爲2017-10-06不是有效的列名稱。在執行它之前打印出stment以查看。

如果你知道什麼列名只是指定它們在查詢:

values = ['Red', 2, Date] 
c.execute("INSERT INTO xtrasmall (color, quantity, date) values (?, ?, ?)", values) 
conn.commit() 

您需要使用?爲要插入每一列。


它看起來像你想插入字典使用其鍵和值。這是可以做到這樣的:

record = {'date':'2017-10-06', 'color': 'Red', 'quantity': 2} 

columns = ','.join(record.keys()) 
placeholders = ','.join('?' * len(record.values())) 
sql = 'INSERT INTO xtrasmall ({}) VALUES ({})'.format(columns, placeholders) 
c.execute(sql, record.values()) 

該代碼將生成參數化的SQL語句:

INSERT INTO xtrasmall (date,color,quantity) VALUES (?,?,?) 

,然後用字典的值作爲參數來執行。

+0

感謝您的回答。我得到你的解釋。我打印出來看看它是怎樣的。但列名是tkinter gui應用程序中的下拉列表。因此取決於選擇哪個名稱,它將與日期一起插入到表格中,從而進行字符串插值。有沒有辦法解決它? – TBright

+0

@TBright:我的答案的後半部分應該幫助你。您需要注意在UI中選擇了所有必需的列。 – mhawke

+0

我試過了,但沒有奏效。我的表只有一個日期列,其餘列是顏色。表格中的輸入字段是從UI接收到的數量,然後查找所選的特定顏色並將其保存在具有日期的列下。當我嘗試你的答案時,它試圖尋找不在我桌子上的列。 – TBright

相關問題