我试图使用SQLite和Python将五个变量写入数据库中的表。以下是我的代码和我得到的错误:
CODE:
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))
我以为我曾尝试过尽可能多地改变标点符号和间距,但这最终成功了。
答案 0 :(得分:2)
你在SQL字符串后的最后一行中缺少一个逗号 - 它应该是
def new_line(name):
fr = open(name, 'r')
string = fr.read()
m = re.findall('\s+[A-Z]\w*', string,re.MULTILINE)
for i in m:
j = str(i)
print("These are the list items:"+j+"\n")
n = re.sub('(\s[A-Z])',r'\n\1',string,re.MULTILINE)
fw = open('output_file', 'w')
fw.write(n)
fw.close()
print('/////////////////////////////////////////////')
print("Output :\n"+n)
print(m)
new_line('task.txt')
答案 1 :(得分:0)
实际上,为了清晰和将来的维护,您应该具体说明插入的内容和位置。所以你的陈述应该是这样的,例如:
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语句的强大功能吗? 有问题吗?将该死的东西打印出来看看吧!十分之九是显而易见的。