python-3.x - 使用 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?
我无法想到为什么需要它。感谢您的回答。
谢谢, 马尼坎塔
解决方案
(%s
或者%(var_name)s
如果传递参数字典)语法表示在执行事务时要用值填充的参数。这种语法允许psycopg
将 Python 值转换为 SQL 值(例如None
to 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。
相关文件。
推荐阅读
- python - NetworkX - 从数据框设置节点属性
- java - 如何生成具有非重复数字的二维数组表?
- python-3.x - 将 csv 文件写入 sqlite3 数据库时遇到无法识别的令牌错误
- go - 是否可以更改 os.Args 的值,以便我可以将测试添加到我正在创建的 CLI 中?
- apache-kafka - kafka记录没有被删除
- twitter-bootstrap - 如何在不将徽标品牌移动到中心的情况下修复中心菜单?
- game-development - 如何在 Gamemaker Studio 1.4 中创建类似于 MOTHER 系列的里程计/滚动计生命系统?
- twilio - Twilio Autopilot:如何从 Airtable 中提取数据并将结果返回给用户?
- c++ - Qt QTableView paint() 事件无限期交付,消耗 1 个 CPU 内核的 100%
- javascript - 如何在 reactjs 中与组件一致地使用网格布局