Python sqlite3 cursor.execute() 与参数导致语法错误接近 ?(参数样式 qmark)



在搜索直到疯狂之后,我决定在这里发布一个问题。我尝试创建一个sqlite3数据库,我想在其中使用cursor.execute(SQL,param)函数的安全变量替换函数。我的函数是这样的:

#!/usr/bin/env python3
#-*- coding: utf-8 -*-
import sqlite3
def create():
    values = ("data")
    sql = "CREATE TABLE IF NOT EXISTS ? ( name TEXT, street TEXT, time REAL, age INTEGER )"
    con = sqlite3.connect("database.db")
    c = con.cursor()
    c.execute(sql, values)
    con.commit()
    c.close()
    con.close()
if __name__ = "__main__":
    create()

我知道第一个参数应该是字符串形式的sql命令,第二个参数必须是应该替换的值的元组,其中sql字符串中有?。但是,当我运行该文件时,它会返回以下错误:

$ ./test.py 
Traceback (most recent call last):
  File "./test.py", line 21, in <module>
    create()
  File "./test.py", line 14, in create
    c.execute(sql, values)
sqlite3.OperationalError: near "?": syntax error

当参数样式设置为命名时也会发生这种情况(例如:table form)。我在这里找不到语法错误,所以我认为问题一定是系统某处引起的。我在 Archlinux 和 Debian 安装上测试了它,两者都给我发布了相同的错误。

现在由你决定,因为我已经不知道在哪里寻找原因了。

SQL 参数只能应用于插入数据,而不能应用于表名。这意味着甚至不会为 DDL 语句解析参数。

为此,您必须使用字符串格式:

sql = "CREATE TABLE IF NOT EXISTS {} ( name TEXT, street TEXT, time REAL, age INTEGER )".format(*values)

据我了解,您的参数是表名?

所以你的命令将是

tbl = 'my_table'
sql = "CREATE TABLE IF NOT EXISTS '%s' ( name TEXT, street TEXT, time REAL, age INTEGER )" % tbl

最新更新