用变量名写入SQLite表(Python)

时间:2015-08-20 11:06:51

标签: python database sqlite dataframe

我试图使用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))

我以为我曾尝试过尽可能多地改变标点符号和间距,但这最终成功了。

2 个答案:

答案 0 :(得分:2)

你在SQ​​L字符串后的最后一行中缺少一个逗号 - 它应该是

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语句的强大功能吗? 有问题吗?将该死的东西打印出来看看吧!十分之九是显而易见的。