使用 Python 将数据动态插入 SQL 数据库
Inserting data into SQL database dynamically with Python
我一直在尝试将一些 Python 列表中的数据输入数据库,这样做:
import sqlite3
db = sqlite3.connect('database.db')
c = db.cursor()
a = ["col1", "col2", "col3"]
b = ["value1", "value2", "value3"]
c.execute("INSERT INTO table_name(?) VALUES (?)", (tuple(a), tuple(b)))
db.commit
但是我总是得到这个错误:
Traceback (most recent call last):
File "testing.py", line 95, in <module>
c.execute("INSERT INTO table_name(?) VALUES (?)", (tuple(a), tuple(b)))
sqlite3.OperationalError: near "?": syntax error
我试过简化事情并使用循环一次从列表中取出一个项目,然后只添加这些项目,但这也没有用。事实上,如果我尝试传入单个变量(比如:
a = "col1"
b = "val1"
c.execute("INSERT INTO table_name(?) VALUES (?)", (a, b))
尽管如此,当我尝试手动传递列名和变量名时,数据库更新时没有任何问题。我错过了什么?
您不能使用占位符来阻止 SQL 解析器准备查询计划。这意味着 table 名称和列都不能是占位符。
插入时,您可以始终使用占位符插入所有值。然后你需要用适当数量的 None
填充你的插入元组作为缺失值:
b = [None, "value2", None]
c.execute("INSERT INTO table_name (foo, bar, baz) VALUES (?, ?, ?)", (tuple(values)))
或者,您可以动态构建列名称,但保留值的占位符:
column_names = ["foo", "bar"].join(",")
placeholders = ["?","?"].join( "," )
statement = "INSERT INTO table_name (" + column_names + ") VALUES ("+placeholders+")"
c.execute(statement)
只要你确定不允许用户指定列名或者只要你通过字典验证它们,你就可以使用这种方法。
我一直在尝试将一些 Python 列表中的数据输入数据库,这样做:
import sqlite3
db = sqlite3.connect('database.db')
c = db.cursor()
a = ["col1", "col2", "col3"]
b = ["value1", "value2", "value3"]
c.execute("INSERT INTO table_name(?) VALUES (?)", (tuple(a), tuple(b)))
db.commit
但是我总是得到这个错误:
Traceback (most recent call last):
File "testing.py", line 95, in <module>
c.execute("INSERT INTO table_name(?) VALUES (?)", (tuple(a), tuple(b)))
sqlite3.OperationalError: near "?": syntax error
我试过简化事情并使用循环一次从列表中取出一个项目,然后只添加这些项目,但这也没有用。事实上,如果我尝试传入单个变量(比如:
a = "col1"
b = "val1"
c.execute("INSERT INTO table_name(?) VALUES (?)", (a, b))
尽管如此,当我尝试手动传递列名和变量名时,数据库更新时没有任何问题。我错过了什么?
您不能使用占位符来阻止 SQL 解析器准备查询计划。这意味着 table 名称和列都不能是占位符。
插入时,您可以始终使用占位符插入所有值。然后你需要用适当数量的 None
填充你的插入元组作为缺失值:
b = [None, "value2", None]
c.execute("INSERT INTO table_name (foo, bar, baz) VALUES (?, ?, ?)", (tuple(values)))
或者,您可以动态构建列名称,但保留值的占位符:
column_names = ["foo", "bar"].join(",")
placeholders = ["?","?"].join( "," )
statement = "INSERT INTO table_name (" + column_names + ") VALUES ("+placeholders+")"
c.execute(statement)
只要你确定不允许用户指定列名或者只要你通过字典验证它们,你就可以使用这种方法。