51

当变量在 Python 中时,是否有向 PostgreSQL 数据库输入NULL键值的好习惯?None

运行此查询:

mycursor.execute('INSERT INTO products (user_id, city_id, product_id, quantity, price) VALUES (%i, %i, %i, %i, %f)' %(user_id, city_id, product_id, quantity, price))

当is时导致TypeError异常。user_idNone

当值为 时,如何使用驱动程序将 aNULL插入数据库?Nonepsycopg2

4

4 回答 4

66

要将空值插入数据库,您有两种选择:

  1. 从您的 INSERT 语句中省略该字段,或
  2. 采用None

另外:为了防止 SQL 注入,您不应该对查询使用正常的字符串插值。

您应该将两 (2) 个参数传递给execute(),例如:

mycursor.execute("""INSERT INTO products 
                    (city_id, product_id, quantity, price) 
                    VALUES (%s, %s, %s, %s)""", 
                 (city_id, product_id, quantity, price))

备选方案 #2:

user_id = None
mycursor.execute("""INSERT INTO products 
                    (user_id, city_id, product_id, quantity, price) 
                    VALUES (%s, %s, %s, %s, %s)""", 
                 (user_id, city_id, product_id, quantity, price))
于 2010-11-20T06:59:29.043 回答
6

使用当前的 psycopg,而不是 None,使用设置为“NULL”的变量。

variable = 'NULL'
insert_query = """insert into my_table values(date'{}',{},{})"""
format_query = insert_query.format('9999-12-31', variable, variable)
curr.execute(format_query)
conn.commit()

>> insert into my_table values(date'9999-12-31',NULL,NULL)
于 2019-04-15T19:04:00.827 回答
1

这是我的解决方案:

text = 'INSERT INTO products (user_id, city_id, product_id, quantity, price) VALUES (%i, %i, %i, %i, %f)' %(user_id, city_id, product_id, quantity, price))

text = text.replace("nan", "null")

mycursor.execute(text)
于 2021-02-10T23:57:09.893 回答
0

一种更简单的方法,也适用于大量列:

row是要插入的值列表,其中可能包含None。要将其插入 PostgreSQL,我们执行以下操作

values = ','.join(["'" + str(i) + "'" if i else 'NULL' for i in row])
cursor.execute('insert into myTable VALUES ({});'.format(values))
conn.commit()
于 2019-09-21T02:14:01.893 回答