2011-11-29 46 views
6

Tôi muốn chèn danh sách vào cơ sở dữ liệu của mình nhưng không thể.Chèn danh sách vào cơ sở dữ liệu của tôi bằng cách sử dụng Python

Dưới đây là một ví dụ về những gì tôi cần:

variable_1 = "HELLO" 
variable_2 = "ADIOS" 
list = [variable_1,variable_2] 

INSERT INTO table VALUES ('%s') % list 

một cái gì đó như thế này có thể được thực hiện? Tôi có thể chèn danh sách dưới dạng giá trị không? Khi tôi thử, một lỗi cho biết là do lỗi trong cú pháp MySQL

+2

Nói chung, nếu bạn có một thông báo lỗi, bạn nên bao gồm nó trong câu hỏi. –

+0

tại sao không sử dụng redis? Nếu sử dụng mô-đun ast và redis-py, u có thể viết một danh sách để redis.eg.r.set (a, [1,23,3]) khi bạn cần đối tượng này, bạn có thể sử dụng b = ast.literal_eval (r.get (a)) để có được danh sách –

Trả lời

12

Câu trả lời cho câu hỏi ban đầu của bạn là: Không, bạn không thể chèn danh sách như thế.

Tuy nhiên, với một số tinh chỉnh, bạn có thể làm mà công việc mã bằng cách sử dụng %r và đi qua trong một tuple:

variable_1 = "HELLO" 
variable_2 = "ADIOS" 
varlist = [variable_1, variable_2] 
print "INSERT INTO table VALUES %r;" % (tuple(varlist),) 

Thật không may, mà phong cách của chèn biến lá mã của bạn dễ bị tổn thương để SQL injection attacks.

Thay vào đó, chúng tôi khuyên bạn sử dụng Python's DB API và xây dựng một chuỗi truy vấn tùy biến với nhiều dấu hỏi cho các dữ liệu được chèn vào:

variable_1 = "HELLO" 
variable_2 = "ADIOS" 
varlist = [variable_1,variable_2] 
var_string = ', '.join('?' * len(varlist)) 
query_string = 'INSERT INTO table VALUES (%s);' % var_string 
cursor.execute(query_string, varlist) 

Ví dụ vào đầu của SQLite3 docs cho thấy làm thế nào để vượt qua đối số bằng cách sử dụng câu hỏi nhãn hiệu và nó giải thích lý do tại sao chúng là cần thiết (về cơ bản, nó đảm bảo trích dẫn chính xác các biến của bạn).

4

Câu hỏi của bạn không rõ ràng.

Bạn có muốn chèn danh sách dưới dạng chuỗi văn bản được phân cách bằng dấu phẩy vào một cột trong cơ sở dữ liệu không? Hay bạn muốn chèn từng phần tử vào một cột riêng biệt? Hoặc là có thể, nhưng kỹ thuật này là khác nhau.

Chèn dấu phẩy phân cách danh sách vào một cột:

conn.execute('INSERT INTO table (ColName) VALUES (?);', [','.join(list)]) 

Chèn vào cột riêng biệt:

params = ['?' for item in list] 
    sql = 'INSERT INTO table (Col1, Col2. . .) VALUES (%s);' % ','.join(params) 
    conn.execute(sql, list) 

cả giả sử bạn đã thiết lập một conn tên kết nối.

Một vài gợi ý khác:

  • Cố gắng tránh câu lệnh INSERT để không liệt kê tên và thứ tự của các cột bạn đang chèn vào. Đó là loại tuyên bố dẫn đến mã rất mong manh; nó sẽ hỏng nếu bạn thêm, xóa hoặc di chuyển các cột xung quanh trong bảng của bạn.

  • Nếu bạn đang chèn danh sách được phân tách bằng dấu phẩy vào một trường đơn, thường vi phạm nguyên tắc thiết kế cơ sở dữ liệu và bạn nên sử dụng một bảng riêng biệt với một giá trị cho mỗi bản ghi.

  • Nếu bạn đang chèn vào các trường riêng biệt và chúng có tên như Word1Word2, đó cũng là dấu hiệu cho thấy bạn nên sử dụng bảng riêng biệt thay thế.

  • Không bao giờ sử dụng thay thế chuỗi trực tiếp để tạo câu lệnh SQL. Nó sẽ phá vỡ nếu một trong các giá trị là, ví dụ o'clock. Nó cũng mở ra cho bạn các cuộc tấn công của những người sử dụng kỹ thuật tiêm SQL.

+0

HI Larry .... Tôi muốn chèn hai chuỗi khác nhau trong cùng một cột .... vì vậy khi tôi thực hiện truy vấn để có được những gì bên trong colum đó .... Tôi biết rằng có hai chuỗi khác nhau ..... đó là lý do tại sao tôi đang cố gắng để chèn giá trị như một danh sách – mauguerra

+1

Bạn không thể làm điều đó. Một cột chỉ có thể chứa một chuỗi. Bạn có thể có một dấu phẩy trong chuỗi đó để làm cho nó trông giống như hai chuỗi khác nhau, nhưng rõ ràng là không hoạt động nếu một trong các chuỗi * đã * có dấu phẩy. Nhưng bạn nên tìm kiếm ý tưởng về chuẩn hóa cơ sở dữ liệu và thiết kế lại cơ sở dữ liệu của bạn để sử dụng một bảng riêng biệt có liên quan để giữ các giá trị này. Không bao giờ, bao giờ, bao giờ đặt nhiều hơn một giá trị vào một cột cơ sở dữ liệu. –

1

Bạn có thể sử dụng json.dumps để chuyển đổi danh sách thành json và ghi json vào db.

Ví dụ:

insert table example_table(column_name) values(json.dumps(your_list)) 
+0

Ví dụ này rất khó hiểu. Bạn không thể sử dụng hàm Python như 'json.dumps' từ bên trong chuỗi SQL của bạn. Bạn sẽ phải gọi 'json.dumps' trước, sau đó sử dụng một trong các phương thức thay thế tham số được đề xuất trong các câu trả lời khác để truyền chuỗi JSON kết quả dưới dạng tham số. Nó cũng thường không phải là một ý tưởng tốt để lưu trữ các chuỗi JSON trong một cột cơ sở dữ liệu. – tsleyson

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