Hướng dẫn python pass list of strings to sql query - python chuyển danh sách các chuỗi sang truy vấn sql

Làm thế nào để chuyển một danh sách các chuỗi python cho truy vấn SQL như select * from table where name in (names_from_python_list) trong đó

  select * from table where name in ('john','james','mary')
0 là dấu phẩy được phân tách khỏi danh sách Python?

Làm

  select * from table where name in ('john','james','mary')
1 đưa ra tất cả các tên trong danh sách dưới dạng chuỗi, tức là.

 select * from table where name in ('john,james,mary')

Trong khi đó, những gì tôi muốn làm là:

  select * from table where name in ('john','james','mary')

Hỏi ngày 12 tháng 9 năm 2019 lúc 15:27Sep 12, 2019 at 15:27

Hướng dẫn python pass list of strings to sql query - python chuyển danh sách các chuỗi sang truy vấn sql

3

Thay vì phát minh lại bánh xe, tôi khuyên bạn nên xem xét các giải pháp tự nhiên, các thư viện DB trưởng thành cung cấp.

PSQYCOPG2, ví dụ: Cho phép đăng ký bộ điều hợp để danh sách xử lý (và các chuỗi khác) trở nên trong suốt, bạn có thể chỉ trực tiếp vượt qua danh sách dưới dạng tham số truy vấn. Đây là một ví dụ: https://chistera.yi.org/~dato/blog/entries/2009/03/07/psycopg2_sql_in.html

PYMYSQL cũng cung cấp một bộ thoát hiểm tích hợp tốt, bao gồm một bộ để xử lý các chuỗi để bạn không phải lo lắng về định dạng thủ công (dễ bị lỗi) và có thể trực tiếp sử dụng Tuple làm đối số trong mệnh đề. Thí dụ:

>>> conn = pymysql.connect(host='localhost', user='root', password='root', db='test')
>>> c.execute('select * from hosts where ip in %s', (('ip1', 'ip2'),))
>>> c.fetchall()
((1, 'mac1', 'ip1'), (3, None, 'ip2'))

Khá chắc chắn nhiều thư viện/khung trưởng thành khác cung cấp chức năng tương tự.

Đã trả lời ngày 12 tháng 9 năm 2019 lúc 16:27Sep 12, 2019 at 16:27

Vovan Kuznetsovvovan KuznetsovVovan Kuznetsov

3611 huy hiệu vàng3 huy hiệu bạc9 huy hiệu đồng1 gold badge3 silver badges9 bronze badges

Bạn có thể chuyển một tuple vào truy vấn SQL của mình:

query = f"SELECT * FROM table WHERE name IN {tuple(names)}"
c.execute(query,conn)

Nó cũng mạnh mẽ hơn việc sử dụng:

query = "SELECT * FROM table WHERE name IN (?,?)" 
c.execute(query,conn,params)

Vì bạn không gặp lỗi ...

OperationalError: (sqlite3.OperationalError) too many SQL variables

... Khi chuyển một số lượng lớn các biến vào truy vấn

Đã trả lời ngày 21 tháng 2 năm 2020 lúc 11:06Feb 21, 2020 at 11:06

rdmolonyrdmolonyrdmolony

4491 Huy hiệu vàng6 Huy hiệu bạc15 Huy hiệu đồng1 gold badge6 silver badges15 bronze badges

Tham gia bởi

  select * from table where name in ('john','james','mary')
2 và gửi kèm theo mọi thứ bằng
  select * from table where name in ('john','james','mary')
3 (đừng quên thay thế
  select * from table where name in ('john','james','mary')
3 trong các tên bằng
  select * from table where name in ('john','james','mary')
5 để thoát khỏi chúng):

"'" + "','".join(name.replace("'", r"\'") for name in name_list) + "'") + "'"

Hoặc bạn chỉ có thể sử dụng

  select * from table where name in ('john','james','mary')
6 và nhận
  select * from table where name in ('john','james','mary')
7 của danh sách (trừ
  select * from table where name in ('john','james','mary')
8, do đó việc cắt), sử dụng theo cách này sẽ thay đổi các trích dẫn xung quanh chuỗi, tức là, nếu chuỗi là
  select * from table where name in ('john','james','mary')
9, nó sẽ được chuyển đổi thành
>>> conn = pymysql.connect(host='localhost', user='root', password='root', db='test')
>>> c.execute('select * from hosts where ip in %s', (('ip1', 'ip2'),))
>>> c.fetchall()
((1, 'mac1', 'ip1'), (3, None, 'ip2'))
0:

query = 'select * from table where name in ({})'.format(str(name_list)[1:-1])

Đã trả lời ngày 12 tháng 9 năm 2019 lúc 15:29Sep 12, 2019 at 15:29

Hướng dẫn python pass list of strings to sql query - python chuyển danh sách các chuỗi sang truy vấn sql

DjaouadnmdjaouadnmDjaouadNM

21.6K4 Huy hiệu vàng30 Huy hiệu bạc54 Huy hiệu đồng4 gold badges30 silver badges54 bronze badges

2

Điều này có thể phụ thuộc vào đặc thù của trình điều khiển, mặc dù với API DB tiêu chuẩn, nó sẽ trông giống như:

connection.execute('SELECT * FROM table WHERE name IN (?)', (names,))

Với một số trình điều khiển

>>> conn = pymysql.connect(host='localhost', user='root', password='root', db='test')
>>> c.execute('select * from hosts where ip in %s', (('ip1', 'ip2'),))
>>> c.fetchall()
((1, 'mac1', 'ip1'), (3, None, 'ip2'))
1 cũng có thể là
>>> conn = pymysql.connect(host='localhost', user='root', password='root', db='test')
>>> c.execute('select * from hosts where ip in %s', (('ip1', 'ip2'),))
>>> c.fetchall()
((1, 'mac1', 'ip1'), (3, None, 'ip2'))
2,
>>> conn = pymysql.connect(host='localhost', user='root', password='root', db='test')
>>> c.execute('select * from hosts where ip in %s', (('ip1', 'ip2'),))
>>> c.fetchall()
((1, 'mac1', 'ip1'), (3, None, 'ip2'))
3, v.v.

Đã trả lời ngày 12 tháng 9 năm 2019 lúc 15:52Sep 12, 2019 at 15:52

Berealberealbereal

30.7K6 Huy hiệu vàng53 Huy hiệu bạc95 Huy hiệu Đồng6 gold badges53 silver badges95 bronze badges

Tùy thuộc vào chức năng bạn đang sử dụng,? có thể đại diện cho một biến python như.

* "Chọn * từ bảng nơi tên trong?;", (list,)) *

Đã trả lời ngày 12 tháng 9 năm 2019 lúc 15:35Sep 12, 2019 at 15:35

BillynbillynBillyN

1752 Huy hiệu bạc10 Huy hiệu đồng2 silver badges10 bronze badges