2015-07-12 57 views
1

代码从DB字段名称在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区分变量名。

如何避免这种冲突?

回答

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

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

+0

我正在使用'psycopg2'。 'psycopg2'中哪种风格是默认的?后者的风格比前者更易于阅读。但是,如果前者只有autoescape,那么它一定会更好。 –

+0

'psycopg2'接受两者(例如,它正确实现'paramstyle == pyformat'),并且两个版本都自动转义。 – dhke

+0

我认为前者的最大优点是,如果你有很多参数可以插入到数据库中,那么它就更加清晰了,这样你就可以很容易地避免这种错误。所以我坚持第一个。 –