在 Python 中区分变量名和数据库字段名

Posted

技术标签:

【中文标题】在 Python 中区分变量名和数据库字段名【英文标题】:To distinguish variable name from DB field name in Python 【发布时间】:2015-07-12 12:52:46 【问题描述】:

代码

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】:

您示例中的代码无法编译,即它不是有效的 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,需要不同的参数占位符(或合适的包装器)。

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

【讨论】:

我正在使用psycopg2psycopg2 的默认样式是什么?后一种风格比前一种更容易阅读。但是,如果只有前者有自动转义,那就更好了。 psycopg2 接受两者(例如,它正确实现了paramstyle == pyformat)并且两个版本都进行自动转义。 我觉得前者最大的好处是,如果你有很多参数要INSERT到数据库中,它会更清晰,这样你就可以轻松避免错误。所以我坚持第一个。

以上是关于在 Python 中区分变量名和数据库字段名的主要内容,如果未能解决你的问题,请参考以下文章

Linux Samba配置文件常用参数详解

linux中samba配置文件怎么配置

数据库的表名字段名大小写问题

MYSQL 数据库名表名字段名查询

获取所有数据库名表名字段名

仅基于表的一个字段在 Linq 中区分