如何使用Python将'NULL'值插入PostgreSQL数据库?

xpa*_*nta 26 python postgresql null psycopg2 nonetype

NULL当变量None在Python中时,是否有一个很好的做法可以将键值输入PostgreSQL数据库?

运行此查询:

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))
Run Code Online (Sandbox Code Playgroud)

结果在AA TypeError异常,当user_idNone.

如何使用驱动程序NULL将值插入到数据库中?Nonepsycopg2

ber*_*nie 45

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

  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))
Run Code Online (Sandbox Code Playgroud)

备选方案#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))
Run Code Online (Sandbox Code Playgroud)

  • 我也使用 None,并且得到与 @Varun 相同的错误。相同的 python 包 psycopg2,v2.6.2。POSGRESQL v9.6 (3认同)
  • 别客气.这很好地描述了SQL注入攻击:http://en.wikipedia.org/wiki/SQL_injection这与字符串插值有什么关系?:假设您收到不受信任的程序输入.该输入可以包含例如`DROP TABLE`命令. (2认同)
  • 我使用 None 作为列值,但出现错误:ProgrammingError: column "none" does not exist LINE 1: ...01.00-ng20', report_date='2016-03-30', ec_enabled=None, ec_s. .. 这是失败的原始查询:UPDATE kw_daily_data_mart SET hostname='ctrlkey.com', users_licensed=7, license_users=10, sw_version='kw2016.01.00-ng20', report_date='2016-03-30', ec_enabled=无,ec_server_count=1,config_max_file_version=10,av_enabled=True,location_count=1,sso_enabled=False WHERE customer_id=127892 AND installation_id=3585 AND hostname='ctrlkey.com' RETURNING id (2认同)

wol*_*600 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)
Run Code Online (Sandbox Code Playgroud)

  • 这适用于 psycopg2 2.8.4,插入 None 的解决方案最终会在数据库中得到值“None”,至少对于 postgres 来说是这样 (2认同)
  • 如果要插入的字段是文本字段,则使用“NULL”,只需插入这四个字符。上面的答案(使用“无”)是正确的。 (2认同)