[英]Writing to SQLite tables with variable names (Python)
我正在嘗試使用SQLite和Python將五個變量寫入數據庫中的表。 以下是我的代碼和出現的錯誤:
碼:
cur.execute("CREATE TABLE IF NOT EXISTS " + table_name + " (Date real, Morning_5AM_9AM real, Day_9AM_6PM real, Evening_6PM_10PM real, Night_10PM_5AM real)") # this works
export_row= p_transpose.iloc[ii] # Note: p_transpose is the transpose of a DataFrame I read in from Excel
date_object= p_transpose.iloc[ii,0] # date_object is a string here
date_object= date_object.replace('_','')
export_date= int(date_object) # to insert into database table as int instead of string
export_morning= p_transpose.iloc[ii,1]
export_day= p_transpose.iloc[ii,2]
export_eve= p_transpose.iloc[ii,3]
export_night= p_transpose.iloc[ii,4]
cur.execute("SELECT name FROM sqlite_master WHERE type='table'")
available_tables=[item[0] for item in cur.fetchall()] # assigns a list of all table names in database
for iii in range (0, row_count):
if (re.match('\w*'+df_feeder, available_tables[iii])):
relevant_table= available_tables[iii]
cur.execute("INSERT INTO " + relevant_table + "VALUES (?,?,?,?,?)" (export_date, export_morning, export_day, export_eve, export_night))
最后一行錯誤:
TypeError:“ str”對象不可調用
我確保export_...
變量都不包含字符串,因此該字符串必須為relevant_table
。 但是,使用字符串變量創建表(再次參見上面的代碼)工作正常,所以我不明白為什么現在會出現此錯誤。
任何投入將不勝感激。 讓我知道是否還有其他有用的信息。
編輯 :
這是我的追溯,是使用traceback.format_exc()獲得的:
'Traceback (most recent call last):\n File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/idlelib/run.py", line 112, in main\n seq, request = rpc.request_queue.get(block=True, timeout=0.05)\n File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/Queue.py", line 176, in get\n raise Empty\nEmpty\n'
最終編輯,已解決:
有關信息,感謝scytale,現在可以使用:
cur.execute("INSERT INTO " + relevant_table + " VALUES (?,?,?,?,?)", (export_date, export_morning, export_day, export_eve, export_night))
我以為我已經嘗試過以所有可能的方式更改標點和間距,但這終於成功了。
您在SQL字符串后的最后一行中缺少逗號-應該是
cur.execute("INSERT INTO " + relevant_table + "VALUES (?,?,?,?,?)",
(export_date, export_morning, export_day, export_eve, export_night))
確實,為清楚起見和將來的維護,您應該具體說明插入的內容和位置。 因此,您的語句應顯示如下內容:
try:
result = self.db.execute("insert into Recent (Filename,TimeStamp,Icon) values (?,?,?)",(filename,time_stamp,itype))
except sqlite3.Error as e:
wx.MessageBox('Insert Recent file list error'+str(e), 'Error', wx.OK | wx.ICON_INFORMATION)
這不僅使您清楚數據項是什么,還使您知道將它們放在何處。
明確聲明要插入的內容的一個很好的理由是,如果您以后要向表中添加列,則代碼仍將按預期工作。
附帶說明一下,在調試方面,每個人都忘記了print語句的功能嗎?
有問題嗎? 打印出該死的東西,看看吧! 十分之九十分明顯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.