Python Psycopg2 is不仅接受None(非类型)作为单元格项,在使用%s时可以为Null,但不接受f字符串
我正在使用Psycopg2将数据插入Postgres数据库,使用:Python Psycopg2 is不仅接受None(非类型)作为单元格项,在使用%s时可以为Null,但不接受f字符串,python,python-3.x,postgresql,psycopg2,Python,Python 3.x,Postgresql,Psycopg2,我正在使用Psycopg2将数据插入Postgres数据库,使用: params = "ts, price, volume" entry = (1234567, None, 3) cur.execute(f"INSERT INTO stock_data ({params}) VALUES {entry};") 我已经无数次地将这种f-string模式与params和tuple条目一起使用,没有任何问题 有关其他信息,price列没有任何约束,是一个数字(5) 对于这个特定的实例,它给了我一个错
params = "ts, price, volume"
entry = (1234567, None, 3)
cur.execute(f"INSERT INTO stock_data ({params}) VALUES {entry};")
我已经无数次地将这种f-string模式与params和tuple条目一起使用,没有任何问题
有关其他信息,price
列没有任何约束,是一个数字(5)
对于这个特定的实例,它给了我一个错误:
psycopg2.ProgrammingError:列“无”不存在
我所做的一切都导致了这个错误。最终起作用的不是使用f字符串。以下条目有效:
cur.execute(f“插入股票数据({params})值(%s,%s,%s);”,entry)
我的理解是,这些是相同的。为什么后者可以工作,但将条目直接包含到
INSERT
语句中不起作用?格式只是将值插入字符串中:
>>> x = None
>>> f"What should I expect here? {x}"
'What should I expect here? None'
将已格式化的字符串传递给cur.execute()
。传递带有占位符和参数的查询文本时,函数知道如何转换它们
>>> cur.mogrify(f"INSERT INTO stock_data ({params}) VALUES {entry};")
b'INSERT INTO stock_data (ts, price, volume) VALUES (1234567, None, 3);'
>>> cur.mogrify(f"INSERT INTO stock_data ({params}) VALUES (%s, %s, %s);", entry)
b'INSERT INTO stock_data (ts, price, volume) VALUES (1234567, NULL, 3);'
您应该始终在cursor.execute()中使用占位符和参数,这也是为了您自身的安全。阅读,在哪里可以找到这个
警告
绝不,绝不,绝不使用Python字符串连接(+)或字符串参数插值(%)将变量传递给SQL查询字符串。甚至在枪口下也没有
我懂了。谢谢。非常感谢你的警告!嗯,Sql注入,有人吗?