Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Psycopg2 is不仅接受None(非类型)作为单元格项,在使用%s时可以为Null,但不接受f字符串_Python_Python 3.x_Postgresql_Psycopg2 - Fatal编程技术网

Python Psycopg2 is不仅接受None(非类型)作为单元格项,在使用%s时可以为Null,但不接受f字符串

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) 对于这个特定的实例,它给了我一个错

我正在使用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)

对于这个特定的实例,它给了我一个错误:

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注入,有人吗?