在Python中区分变量名称和DB字段名称

时间:2015-07-12 12:52:47

标签: python postgresql-9.4

代码

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

你怎么能避免这种冲突?

1 个答案:

答案 0 :(得分:2)

您的示例中的代码无法编译,即它不是有效的python。 cursor.execute()接受一个字符串和一组可选参数,这些参数根据数据库模块paramstyle扩展到字符串中。

事实上,在使用DBAPI时,您的问题甚至无法解决,因为SQL语法和python语法是完全分开的。

如果您使用psycopg2访问PostgreSQL,则paramstylepyformat,因此

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,并且需要不同的参数占位符(或合适的包装器)。

根据数据库后端的规则,所有参数替换实现都应该正确地转义它们的参数,这是一个很好的重要特性,因为您不必手动转义数据。