这是一个非常老的问题,但这里还有更多细节。
不同的 DBMS 驱动程序实现不同的参数样式。您可以使用类似以下代码片段来找出具体哪一种:
import sqlite3
print(sqlite3.paramstyle) # 'qmark'
import pyodbc
print(pyodbc.paramstyle) # 'qmark'
import mysql.connector
print(mysql.connector.paramstyle) # 'pyformat'
import psycopg2
print(psycopg2.paramstyle) # 'pyformat'
import oracledb
print(oracledb.paramstyle) # 'named'
我已将我自己的测试结果纳入其中。
您可以从以下位置获取参数样式列表:
https://peps.python.org/pep-0249/#paramstyle
以下是摘录:
参数样式
|
意义
|
数字
|
数字、位置样式,例如 … WHERE name=:1
|
命名
|
命名样式,例如 … WHERE name=:name
|
py格式
|
Python 扩展格式代码,例如 … WHERE name=%(name)s
|
佳标
|
问号样式,例如 … WHERE name=?
|
格式
|
ANSI C printf 格式代码,例如 … WHERE name=%s
|
之后,可以创建两个变量,一个用于 SQL,一个用于参数:
sql = 'INSERT INTO table VALUES ?,?,?'
data = (var1, var2, var3)
cursor.execute(sql, data)
这里,我使用了 qmark
样式。这 data
是一个值的元组,但它本来可以是一个列表。重点是,即使只有一个值,您也需要创建一个元组或列表。
如果您的 DBMS 使用 pyf或mat
or named
样式,则可以使用如下内容:
sql = 'INSERT INTO table VALUES %(first)s,%(second)s,%(third)s' # pyformat
sql = 'INSERT INTO table VALUES :first,:second,:third' # named
data = {'first': var1, 'second': var2, 'third': var3}
cursor.execute(sql, data)
这里您使用一个字典,其中的键与 SQL 中使用的任意名称匹配。