【问题标题】:Writing to SQLite tables with variable names (Python)使用变量名写入 SQLite 表(Python)
【发布时间】:2015-08-20 11:06:51
【问题描述】:

我正在尝试使用 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))

我以为我已经尝试以各种可能的方式更改标点符号和间距,但这最终成功了。

【问题讨论】:

  • 请显示更多的堆栈跟踪 - 您省略了告诉我们代码中的哪一行导致错误的部分
  • 当然 - 我已根据您的评论进行了编辑并添加了一些细节。如前所述,错误是由代码的最后一行引起的。除此之外,您还有什么特别想知道的吗?
  • 请添加更多的堆栈跟踪 - 这只是一个好习惯 - 在您的代码中添加注释并不是那么好
  • 你的堆栈跟踪是指输出吗?
  • 谷歌“python stacktrace”

标签: python database sqlite dataframe


【解决方案1】:

您在 SQL 字符串之后的最后一行中缺少逗号 - 应该是

cur.execute("INSERT INTO " + relevant_table + "VALUES (?,?,?,?,?)",
            (export_date, export_morning, export_day, export_eve, export_night))

【讨论】:

  • 这给了我以下错误: OperationalError: near "?": 语法错误。您还有其他想法吗?
  • 还有 - 你需要在VALUES之前添加一个空格
【解决方案2】:

确实,为了清楚起见和将来的维护,您应该具体说明插入的内容和位置。所以你的陈述应该是这样的,例如:

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

【讨论】:

  • Rolf,我在此过程中大量使用了 print 语句 - 我只是在粘贴到这里时删除了代码中的那些行以使其更短。我不太明白你写的代码的最后两行,你能再解释一下吗?如果您认为我插入的内容不清楚,我深表歉意,我尝试仔细阅读我的问题几次以确保它不是。
  • @LinnK。很高兴听到“打印”并没有被堆栈跟踪和花哨的调试器抛弃。最后两行只不过是 try 的异常语句,会显示一个消息框,通知用户插入数据库失败。我希望在这里,这就是您所指的两条线。我在回答中没有提到明确声明要插入的内容的一个很好的理由是,如果您以后在表中添加列,那么代码仍将按预期工作。
  • 好的。谢谢,这是个好建议。我也会在我的代码中使用它。谢谢你的解释,我对 Python 编程很陌生,也许你能说出来。
猜你喜欢
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多