2010-09-11 2 views
15

Trong post about SQLite này, aaronasterling nói với tôi rằng"% s"% định dạng so với "{0}". Định dạng() so với "?" định dạng

  • cmd = "attach \"%s\" as toMerge" % "b.db": là sai
  • cmd = 'attach "{0}" as toMerge'.format("b.db"): là đúng
  • cmd = "attach ? as toMerge"; cursor.execute(cmd, ('b.db',)): là điều đúng đắn

Nhưng, tôi đã nghĩ là người đầu tiên và thứ hai là như nhau. Sự khác nhau giữa ba điều đó là gì?

+0

xin lỗi vì không làm rõ câu trả lời của tôi. Nó đã có vẻ quá dài;) – aaronasterling

+0

@aaronasterling: Ồ, tôi chỉ nghĩ rằng bài đăng này có thể đáng giá một trang. Cảm ơn câu trả lời và trợ giúp. – prosseek

Trả lời

17
"attach \"%s\" as toMerge" % "b.db" 

Bạn nên sử dụng ' thay vì ", vì vậy bạn không phải trốn thoát.

Bạn đã sử dụng các chuỗi định dạng cũ không còn được dùng nữa.

'attach "{0}" as toMerge'.format("b.db") 

Điều này sử dụng tính năng chuỗi định dạng mới từ phiên bản Python mới hơn nên được sử dụng thay cho phiên bản cũ nếu có thể.

"attach ? as toMerge"; cursor.execute(cmd, ('b.db',)) 

Điều này bỏ qua định dạng chuỗi hoàn toàn và sử dụng tính năng SQLite thay vào đó, vì vậy đây là cách phù hợp để thực hiện.

Lợi thế lớn: không có nguy cơ tiêm SQL

3

Vì không bị thoát. Nếu bạn thay thế b.db bằng đầu vào của người dùng, nó sẽ khiến bạn dễ bị tấn công SQL injection.

6

Sản phẩm đầu tiên và thứ hai sản xuất cùng một kết quả, nhưng phương pháp thứ hai được ưu tiên cho các chuỗi định dạng trong các phiên bản Python mới hơn.

Tuy nhiên, thứ ba là cách tiếp cận tốt hơn ở đây vì nó sử dụng tham số thay vì thao tác chuỗi. Điều này nhanh hơn và an toàn hơn.

+2

phương pháp thứ hai, bằng cách ưa thích trong các phiên bản mới hơn của python, bằng cách mở rộng, ưu tiên cho mã mới trong các phiên bản _all_ của python hỗ trợ nó. Đó là một vấn đề đơn giản về khả năng tương thích về phía trước – aaronasterling