2012-03-01 17 views
8

Tôi đang cố gắng lặp qua tất cả các hàng trong bảng có tên Thông lượng, nhưng đối với một DeviceName cụ thể (mà tôi đã lưu trữ trong dữ liệu ['DeviceName'] . tôi đã thử những điều sau đây, nhưng nó không hoạt động:pyodbc - Cách thực hiện lệnh chọn sử dụng biến cho tham số

for row in cursor.execute("select * from Throughput where DeviceName=%s"), %(data['DeviceName']): 

EDIT: cũng đã cố gắng này, nhưng nó không hoạt động:

for row in cursor.execute("select * from Throughput where(DeviceName), values(?)", (data['DeviceName'])): 

EDIT2: Một đoạn mã làm việc cuối cùng của tôi :

query = "select * from Throughput where DeviceName = '%s'" % data['Device Name'] 
     try: 
      for row in cursor.execute(query): 
+0

"Không hoạt động" như thế nào? Bạn nhận được lỗi nào hoặc hành vi không mong muốn? – Andy

Trả lời

-11

Mà không biết các loại cột DeviceName và những gì cơ sở dữ liệu máy chủ, tôi sẽ trích dẫn chuỗi đang được sử dụng để chế ngự DeviceName

"select * from Throughput where DeviceName='%s'" % data['DeviceName'] 

và xem những gì sẽ xảy ra.

+0

Cảm ơn. Điều đó đã làm các trick! – Parth

+6

Nếu 'dữ liệu ['Tên thiết bị']' được người dùng cung cấp theo bất kỳ cách nào (trực tiếp hoặc gián tiếp), bạn chỉ cần tự mở cho các cuộc tấn công SQL injection. Hoặc devicename sử dụng dấu ngoặc kép và điều này chỉ đơn giản là phá vỡ. * Và * nó không hiệu quả vì trình điều khiển không thể sử dụng lại kế hoạch truy vấn đã chuẩn bị cho câu lệnh SQL. –

33

Bạn cũng có thể parameterize báo cáo:

... 
cursor.execute("select * from Throughput where DeviceName = ?", data['DeviceName']) 
... 

một cách tiếp cận tốt hơn này vì những lý do sau đây:

  • Bảo vệ chống SQL injection (bạn nên luôn luôn xác nhận đầu vào người sử dụng cho dù tham số hoặc SQL động được sử dụng)
  • Bạn không phải lo lắng về việc thoát khỏi nơi các giá trị mệnh đề với các dấu nháy đơn vì các tham số được chuyển đến cơ sở dữ liệu riêng biệt
  • SQL được chuẩn bị một lần, các truy vấn tiếp theo của truy vấn sử dụng câu lệnh đã chuẩn bị thay vì biên dịch lại
+0

Khi thực hiện việc này, có cách nào để in ra toàn bộ truy vấn, vì tôi đang gặp lỗi chuyển đổi ngày/giờ, nhưng tôi không biết ở đâu, khi in chuỗi truy vấn, nó hiển thị dấu chấm hỏi thay vì các giá trị thực tế được cho là sẽ thay thế các dấu hỏi đó. Nếu bạn có thể xem xét vấn đề của tôi trên http://stackoverflow.com/questions/37861319/pyodbc-cursor-execute-wont-insert-parameters-into-sql-string?noredirect=1#comment63185389_37861319 Tôi thực sự sẽ đánh giá cao nó . –

+0

@ M.Barbieri, cho phép đăng nhập vào MySQL để xem câu lệnh nào đã được thực thi. – DrDamnit

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