【问题标题】:Brief syntax for inserting row into sqlite database using python sqlite3使用 python sqlite3 将行插入 sqlite 数据库的简要语法
【发布时间】:2015-09-13 13:17:37
【问题描述】:

我有一个大小为 360x120 的 csv 文件,我想将它逐行导入到我的 sqlite 数据库中。对于一行,我知道如果 mytuple 有 2 个元素,则以下语法有效:

import sqlite3
conn = sqlite3.connect(dbLoc)
cur = conn.cursor()
mytuple = (a, b, c, ...) #some long tuple of 120 elements
cur.execute('INSERT INTO tablename VALUES (?, ?)', mytuple)

问题是,我的行包含 120 列,我无法在 cur.execute() 行中输入 120 个问号。实际上我有,它可以工作,但是是的,这不是一个好的解决方案。我尝试过的一件事是:

cur.execute('INSERT INTO tablename VALUES ?', mytuple)

认为它只会做?=mytuple 并用mytuple 替换?,但它没有这样做。对文章sebastianraschka.com/Articles/2014_sqlite_in_python_tutorial.html 的用户评论显示了这样的语法,这对我有用,但它不起作用:

t = ('RHAT',)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)

从这里可以看出,他可以用一个 ? 将一个元组替换到执行字符串中。我怎样才能用INSERT INTO tablename 达到同样的效果?

【问题讨论】:

  • 你可以用','.join(itertools.repeat('?',120))之类的东西来构造120个问号。
  • 确实如此,正如我所说,我已经做了类似的事情,实际上在那里放了 120 个问号。但是我仍然想知道是否有像我在问题中提到的那样漂亮而简单的语法。
  • PEP 0249 和 SQLite 文档都没有显示。
  • 我昨天一整天都在搜索文档和网络,也没有看到任何东西。现在,我将使用'('+','.join(itertools.repeat('?',120))+')',但如果这个丑陋的小部件可以用单个? 代替,那就太好了。将您的评论标记为有用。
  • @KlausD.:构造 120 个问号:'?'*120。完整表达式:'({}?)'.format('?, '*119)

标签: python sql csv sqlite


【解决方案1】:

sqlite3 不支持更简洁的语法:

c.execute('INSERT INTO tablename VALUES ({}?)'.format('?,'*(len(t) - 1)), t)

注意:默认的SQLITE_MAX_COLUMN2000。 SQLite 中的一些算法在列数中为O(n**2),即,如果您增加限制;它可能会减慢数据库操作。

【讨论】:

  • 不敢相信我怎么想不到'?, '*119...这比我的'('+blahblah+')' 语法好。谢谢。
猜你喜欢
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 2013-09-08
  • 2019-08-11
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
相关资源
最近更新 更多