在搜索《疯狂》之后,我决定在这里发布一个问题。我尝试创建一个SQLITE3数据库,我想在其中使用光标的安全变量替代功能。我的功能像这样:

#!/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

当ParamStyle设置为命名时(例如:表格)时,也会发生这种情况。我在这里无法发现语法错误,因此我认为问题必须在系统中的某个地方引起。我在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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top