【问题标题】: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”:语法错误

【问题讨论】:

    标签: sql python-3.x sqlite


    【解决方案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"。但是,我建议您在表名或列名中使用特殊字符,因为您将永远不得不用双引号对它们进行转义。
    • 哦,好吧,表的名称也是动态的(我在原始问题中省略了该部分)。我会四处寻找,看看是否找到适合我需要的东西。再次感谢!
    猜你喜欢
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2018-11-09
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多