使用变量名写入SQLite表(Python)

使用变量名写入SQLite表(Python),python,database,sqlite,dataframe,Python,Database,Sqlite,Dataframe,我试图使用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

我试图使用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))
最后一行出现错误:

        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\u…
变量都不包含字符串,因此字符串必须是
相关的\u表
。但是,使用字符串变量创建表(再次参见上面的代码)效果很好,所以我不明白为什么现在会出现这个错误

如有任何意见,将不胜感激。如果有任何其他信息有用,请告诉我

编辑

这是我的回溯,使用回溯获得。format_exc():

最终编辑,已解决:

        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))
有关信息,多亏了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语句的威力了吗?

有问题吗?把这些该死的东西打印出来看看!!十有八九是显而易见的。

请展示更多stacktrace-您省略了告诉我们代码中哪一行导致错误的部分-我根据您的评论进行了编辑,并添加了一些细节。如前所述,错误是由代码的最后一行引起的。除此之外,您还想知道什么具体的事情吗?请添加更多的stacktrace-这只是一个很好的实践-在代码中添加注释远不如stacktrace好,您的意思是输出吗?google“python stacktrace”这给了我以下错误:OperationalError:near“?”:语法错误。你还有其他想法吗?另外-你需要在
VALUES
Rolf之前添加一个空格,我已经在这一过程中大量使用了print语句-我只是在粘贴到这里时删除了代码中的那些行,以缩短它。我不太明白你写的最后两行代码,你能再解释一下吗?“如果你认为我插入的内容不清楚,我向你道歉,我试着把我的问题读了好几遍,以确保它不清楚。”@LinnK。很高兴听到stacktraces和花哨的调试器没有抛弃“print”。最后两行只不过是try的异常语句,它将显示一个消息框,通知用户插入数据库失败。我希望在这里,这就是你所指的两条线。我在回答中没有提到明确声明插入内容的一个很好的理由是,如果以后向表中添加列,那么代码仍将按预期工作。好的。谢谢你,这是个好建议。我也会将其应用到我的代码中。谢谢你的解释,也许你可以告诉我,我对Python编程还很陌生。