在循环中将字符串插入到表中

Posted

技术标签:

【中文标题】在循环中将字符串插入到表中【英文标题】:Inserting strings to a table in a loop 【发布时间】:2019-06-13 08:09:10 【问题描述】:

您好,我正在尝试通过 python3 中的 sqlite3 在 sqlite 中创建表。 到目前为止我得到的代码是:

import sqlite3
text="hello"
db = sqlite3.connect('C:/DB.db')
c = db.cursor()
c.execute("CREATE TABLE %s (sida)" % name)
for i in range(10):
    c.execute("INSERT INTO %s VALUES (%s)" % (name, str(text))) # This does not work
db.commit()
db.close()
c.close

将值从 str(text) 更改为 i 有效;

c.execute("INSERT INTO %s VALUES (%s)" % (name, i))         # This works

传递整数作为值有效,但不是字符串。我一直在努力寻找解决方案,但我被困住了。

我得到的错误是:

c.execute("INSERT INTO %s VALUES (%s)" % (name, str(text))) sqlite3.OperationalError:靠近“a2”:语法错误

【问题讨论】:

【参考方案1】:

您应该为您的插入使用准备好的语句,将值绑定到任何存在的占位符:

c = db.cursor()
c.execute("CREATE TABLE %s (sida)" % name)
for i in range(10):
    c.execute("INSERT INTO %s VALUES (?)" % name, (str(text),))
db.commit()
db.close()
c.close

其实,最好不要让表名本身动态化。

【讨论】:

哇,真快!谢谢蒂姆!超时后我会接受你的回答 只是为了记录,您的查询/代码中的确切失败模式是您在 VALUES 子句中有一个未引用的字符串。您可以通过在name 周围加上单引号来修复它,但是使用准备好的语句是一个更好的修复方法。 如果你不介意,我会偷偷问另一个问题: c.execute("CREATE TABLE %s (sida)" % str(name) 如果名称由“/”组成,则不接受或“:”或类似字符。有没有办法允许这样做? 是的,将表名放在双引号中,例如CREATE TABLE "blah/stuff"。但是,我建议您在表名或列名中使用特殊字符,因为您将永远不得不用双引号对它们进行转义。 哦,好吧,表的名称也是动态的(我在原始问题中省略了该部分)。我会四处寻找,看看是否找到适合我需要的东西。再次感谢!

以上是关于在循环中将字符串插入到表中的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle 中将结果集插入到表中

在 Oracle Apex 中将图像插入到表中

拆分'$'分隔的字符串并插入到表中

拆分字符串并循环遍历 MySql 过程中的值

如何将键值对象插入redis内部的lua表中

(Golang)将数组中的所有行插入到表中