2010-11-20 30 views
13

Có cách nào tốt để nhập NULL giá trị khóa vào cơ sở dữ liệu PostgreSQL khi biến là None bằng Python?Làm thế nào để chèn các giá trị 'NULL' vào cơ sở dữ liệu PostgreSQL bằng Python?

Chạy truy vấn này:

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)) 

kết quả trong một một ngoại lệ TypeError khi user_idNone.

Làm thế nào để NULL được chèn vào cơ sở dữ liệu khi giá trị là None, sử dụng trình điều khiển psycopg2?

+0

Những bộ chuyển đổi DB-API bạn đang sử dụng? –

+0

bởi bộ chuyển đổi DB-API Tôi cho rằng bạn có nghĩa là giao diện db psycopg2. Nếu không, bạn có thể cụ thể hơn không? – xpanta

Trả lời

27

Để chèn các giá trị null vào cơ sở dữ liệu bạn có hai lựa chọn:

  1. omit rằng lĩnh vực từ câu lệnh INSERT của bạn, hoặc
  2. sử dụng None

Ngoài ra: Để bảo vệ chống lại SQL-injection bạn không nên sử dụng nội suy chuỗi bình thường cho các truy vấn của bạn.

Bạn phải vượt qua hai (2) lập luận để execute(), ví dụ .:

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

Alternative # 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)) 
+0

Cảm ơn bạn. Bạn có thể chỉ cho tôi một nơi nào đó để tôi có thể đọc lý do tại sao chuỗi nội suy trong python có thể dẫn đến sql-injection. Điều này rất thú vị và tôi đã không nghĩ về điều đó. – xpanta

+2

Bạn được chào đón. Điều này mô tả tốt những gì các cuộc tấn công SQL injection là: http://en.wikipedia.org/wiki/SQL_injection Làm thế nào điều này liên quan đến nội suy chuỗi ?: Giả sử bạn nhận được đầu vào không tin cậy vào chương trình của bạn. Đầu vào đó có thể chứa, ví dụ, lệnh 'DROP TABLE'. – bernie

+0

Tôi đang sử dụng Không cho giá trị cột nhưng gặp lỗi: Lập trìnhLỗi: cột "none" không tồn tại LINE 1: ... 01.00-ng20 ', report_date =' 2016-03-30 ', ec_enabled = Không, ec_s ... Đây là truy vấn ban đầu không thành công: CẬP NHẬT kw_daily_data_mart Đặt tên máy chủ = 'ctrlkey.com', users_licensed = 7, authorized_users = 10, sw_version = 'kw2016.01.00-ng20', report_date = '2016- 03-30 ', ec_enabled = Không, 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 –

Các vấn đề liên quan