2009-09-23 14 views
30

Cách tốt nhất để thực hiện truy vấn tham số pass psycopg2 thành PostgreSQL là gì? Tôi không muốn viết cơ chế escpaing của riêng tôi hoặc adapter và mã nguồn psycopg2 và các ví dụ rất khó để đọc trong một trình duyệt web.Truy vấn tham số với psycopg2/Python DB-API và PostgreSQL

Nếu tôi cần chuyển sang một cái gì đó như PyGreSQL hoặc bộ điều hợp pg trăn khác, điều đó tốt với tôi. Tôi chỉ muốn tham số đơn giản.

+0

Những loại của tham số hóa nào bạn muốn? Mẫu giả giả sẽ hữu ích. – whatnick

+0

Sidenote, bạn có thể muốn xem xét SQLAlchemy, chi phí nhập cảnh có thể cao hơn một chút theo một số cách, nhưng nó thực sự là một ORM rất tốt. –

+0

Để tham khảo trong tương lai, câu trả lời nằm ở trang đầu tiên của tài liệu: http://initd.org/psycopg/docs/usage.html – piro

Trả lời

60

psycopg2 tuân thủ các quy tắc cho DB-API 2.0 (được đặt trong PEP-249). Điều đó có nghĩa là bạn có thể gọi phương thức execute từ đối tượng cursor của mình và sử dụng kiểu pyformat ràng buộc và nó sẽ thực hiện thoát cho bạn. Ví dụ, sau nên được an toàn (và nơi làm việc):

cursor.execute("SELECT * FROM student WHERE last_name = %(lname)s", 
       {"lname": "Robert'); DROP TABLE students;--"}) 
+42

LOL, tôi hiểu rồi ... Little Bobby Tables! http://xkcd.com/327/ – adam

+1

Vậy mã trên cũng vậy. Giọt bàn hay không? – mascot6699

+1

@ mascot6699 không, vì truy vấn được tham số hóa. –

13

Dưới đây là một vài ví dụ bạn có thể thấy hữu ích

cursor.execute('SELECT * from table where id = %(some_id)d', {'some_id': 1234}) 

Hoặc bạn có thể tự động tạo truy vấn dựa trên một dict của tên trường, giá trị:

fields = ', '.join(my_dict.keys()) 
values = ', '.join(['%%(%s)s' % x for x in my_dict]) 
query = 'INSERT INTO some_table (%s) VALUES (%s)' % (fields, values) 
cursor.execute(query, my_dict) 

Lưu ý: các lĩnh vực phải được xác định trong mã của bạn, không phải là đầu vào của người dùng, nếu không bạn sẽ dễ bị tiêm SQL.

+5

Vâng trừ khi bạn biết bạn đang làm gì, bạn chỉ cần nhập vào các truy vấn sql, vì nó là một SQL injection. –

+3

downvoted do gợi ý mà lá bạn mở để tiêm SQL –

+2

@RandySyring Điều này chỉ mở để tiêm SQL nếu các khóa không được xác định rõ và định danh thích hợp. Các giá trị vẫn được parametrized đúng cách. – cpburnz

10

Từ các tài liệu psycopg

(http://initd.org/psycopg/docs/usage.html)

Cảnh báo Không bao giờ, không bao giờ, không bao giờ sử dụng Python chuỗi nối (+) hoặc nội suy tham số chuỗi (%) để chuyển các biến vào một chuỗi truy vấn SQL. Không, ngay cả ở gunpoint.

Cách đúng để vượt qua các biến trong một lệnh SQL được sử dụng đối số thứ hai của phương thức execute():

SQL = "INSERT INTO authors (name) VALUES (%s);" # Note: no quotes

data = ("O'Reilly",)

cur.execute(SQL, data) # Note: no % operator

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