首页 > 解决方案 > 使用 python pyscopg2 将值输入数据库时​​在插入命令中提供 %s 的原因是什么

问题描述

我试图在 PostgreSQL 中的数据库表中输入值,所以我使用的是 psycopg2 模块。

我使用的语法如下:

Load_data= """

insert into stocks (Date, Symbol, Open, High, Low, Close, Volume, Delivery, Delivery_percent)
values (%s, %s, %s, %s, %s, %s, %s, %s, %s);

"""

我用我的 cursor.execute(Load_data) 和 conn.commit() 调用它。我能够加载数据,但我想知道为什么我应该在值中提供 %s?

我无法想到为什么需要它。感谢您的回答。

谢谢, 马尼坎塔

标签: python-3.xpostgresqlsql-insertpsycopg2

解决方案


%s或者%(var_name)s如果传递参数字典)语法表示在执行事务时要用值填充的参数。这种语法允许psycopg将 Python 值转换为 SQL 值(例如Noneto NULL),如果您考虑需要转换的所有不同类型,这将非常方便。

此语法还允许在将参数传递给查询时使用更简单的表示法,以便可以使用不同的值重用相同的查询文本。例如:

def insert_row(name):
    query_text = "INSERT INTO my_table (name) VALUES (%s);"
    cursor.execute(query_text, [name]) # or cursor.execute(query_text, (name,))

最后,在我看来,最重要的是,psycopg还清理参数值以避免 SQL 注入攻击。

您可能想知道为什么不直接使用字符串插值或连接来构建具有所需值的查询字符串,如下所示:

def insert_row(name):
    query_text = f"INSERT INTO my_table (name) VALUES ('{name}');"
    cursor.execute(query_text)

这种方法适用于大多数用途(特别是因为字符串翻译不需要太多努力),但是如果name来自用户并且该用户提供name. "my_name'); DROP TABLE my_table;"

然后插值query_text变为"INSERT INTO my_table (name) VALUES ('my_name'); DROP TABLE my_table;');"。这将插入字符串'my_name'作为name值并删除my_table表,这可能是您想要避免的事情。

在此处使用参数表示法 ( %s) 将导致插入的名称值是提供的字符串 ( "my_name'); DROP TABLE my_table;"),而不是允许该字符串在数据库中执行任意 SQL。

相关文件


推荐阅读