【问题标题】:Python pysqlite not accepting my qmark parameterizationPython pysqlite 不接受我的 qmark 参数化
【发布时间】:2010-10-03 05:18:59
【问题描述】:

我认为我是个傻瓜,也许没有导入正确的包,但是当我这样做时......


from pysqlite2 import dbapi2 as sqlite
import types
import re
import sys
...
    def create_asgn(self):
        stmt = "CREATE TABLE ? (login CHAR(8) PRIMARY KEY NOT NULL, grade INTEGER NOT NULL)"
        stmt2 = "insert into asgn values ('?', ?)"
        self.cursor.execute(stmt, (sys.argv[2],))
        self.cursor.execute(stmt2, [sys.argv[2], sys.argv[3]])
...
 我收到错误 pysqlite2.dbapi2.OperationalError: near "?": syntax error 

这对我来说意义不大,因为文档显示 pysqlite 是 qmark 参数化的。不过,我是 python 和 db-api 的新手,请帮帮我!谢谢

【问题讨论】:

    标签: python sqlite pysqlite python-db-api


    【解决方案1】:

    这是因为参数只能传递给 VALUES。表名不能参数化。

    您在第二个查询中的参数化参数周围也有引号。删除引号,转义由下划线库自动为您处理。

    【讨论】:

      【解决方案2】:

      尝试删除分配给stmt2 的行中的引号:

          stmt2 = "insert into asgn values (?, ?)"
      

      此外,正如 nosklo 所说,您不能将问号参数化与 CREATE TABLE 语句一起使用。将表名直接粘贴到 SQL 中。

      【讨论】:

        【解决方案3】:

        如果你真的想这样做,试试这样的:

        def read(db="projects"):

        sql = "select * from %s"
        sql = sql % db
        c.execute(sql)
        

        【讨论】:

        • 在 SQL 中使用表名的反引号形式(即:`table` 而不是 table)并创建一个函数 remove_backticks(inputString),该函数返回删除所有反引号的 inputString。然后编写上述查询(因为您提供了该示例):sql="SELECT * from `%s`" % remove_backticks(db)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-25
        • 2023-03-28
        • 2019-03-10
        相关资源
        最近更新 更多