在 Python 中区分变量名和数据库字段名
To distinguish variable name from DB field name in Python
代码
import psycopg2
import psycopg2.extras
def store_values_to_pg94(file_size, connection):
cursor = connection.cursor()
cursor.execute(
INSERT INTO measurements
(file_size)
VALUES (file_size)
其中列的字段名在PostgreSQL 9.4中是file_size
但变量名在Python中也是file_size
。
如何避免这种冲突?
您示例中的代码无法编译,即无效 python。 cursor.execute()
接受一个字符串和一组可选的参数,这些参数根据数据库模块的 paramstyle
.
扩展到字符串中
事实上,当使用 DBAPI
时,您的问题甚至不会浮出水面,因为 SQL 语法和 python 语法是完全分开的。
如果您使用 psycopg2
访问 PostgreSQL,paramstyle
是 pyformat
,因此
cursor.execute(
'INSERT INTO measurements (file_size) VALUES (%(file_size)s);',
file_size=file_size # pass variable file_size as named parameter file_size
);
如您所见,您指定 SQL 查询并为要从 python 代码传入的值保留占位符。
如果paramstyle == 'pyformat'
,也可以使用位置参数:
cursor.execute(
'INSERT INTO measurements (file_size) VALUES (%s);',
file_size # pass variable file_size as positional parameter
);
请注意,不同的数据库访问模块实现不同的 paramstyle
,并且需要不同的参数占位符(或合适的包装器)。
所有参数替换实现都应根据数据库后端的规则正确转义其参数,这是一个很好且重要的功能,因为您不必手动转义数据。
代码
import psycopg2
import psycopg2.extras
def store_values_to_pg94(file_size, connection):
cursor = connection.cursor()
cursor.execute(
INSERT INTO measurements
(file_size)
VALUES (file_size)
其中列的字段名在PostgreSQL 9.4中是file_size
但变量名在Python中也是file_size
。
如何避免这种冲突?
您示例中的代码无法编译,即无效 python。 cursor.execute()
接受一个字符串和一组可选的参数,这些参数根据数据库模块的 paramstyle
.
事实上,当使用 DBAPI
时,您的问题甚至不会浮出水面,因为 SQL 语法和 python 语法是完全分开的。
如果您使用 psycopg2
访问 PostgreSQL,paramstyle
是 pyformat
,因此
cursor.execute(
'INSERT INTO measurements (file_size) VALUES (%(file_size)s);',
file_size=file_size # pass variable file_size as named parameter file_size
);
如您所见,您指定 SQL 查询并为要从 python 代码传入的值保留占位符。
如果paramstyle == 'pyformat'
,也可以使用位置参数:
cursor.execute(
'INSERT INTO measurements (file_size) VALUES (%s);',
file_size # pass variable file_size as positional parameter
);
请注意,不同的数据库访问模块实现不同的 paramstyle
,并且需要不同的参数占位符(或合适的包装器)。
所有参数替换实现都应根据数据库后端的规则正确转义其参数,这是一个很好且重要的功能,因为您不必手动转义数据。