Nhiều cách. Đừng sử dụng cái rõ ràng nhất [%s
với %
] trong mã thực, nó mở ra cho các cuộc tấn công.DON'T use the most obvious one [%s
with %
] in real code, it's open to attacks.
Ở đây sao chép-paste'd từ pydoc của sqlite3:from pydoc of sqlite3:
# Never do this -- insecure!
symbol = 'RHAT'
cur.execute["SELECT * FROM stocks WHERE symbol = '%s'" % symbol]
# Do this instead
t = ['RHAT',]
cur.execute['SELECT * FROM stocks WHERE symbol=?', t]
print[cur.fetchone[]]
# Larger example that inserts many records at a time
purchases = [['2006-03-28', 'BUY', 'IBM', 1000, 45.00],
['2006-04-05', 'BUY', 'MSFT', 1000, 72.00],
['2006-04-06', 'SELL', 'IBM', 500, 53.00],
]
cur.executemany['INSERT INTO stocks VALUES [?,?,?,?,?]', purchases]
Nhiều ví dụ hơn nếu bạn cần:
# Multiple values single statement/execution
c.execute['SELECT * FROM stocks WHERE symbol=? OR symbol=?', ['RHAT', 'MSO']]
print c.fetchall[]
c.execute['SELECT * FROM stocks WHERE symbol IN [?, ?]', ['RHAT', 'MSO']]
print c.fetchall[]
# This also works, though ones above are better as a habit as it's inline with syntax of executemany[].. but your choice.
c.execute['SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO']
print c.fetchall[]
# Insert a single item
c.execute['INSERT INTO stocks VALUES [?,?,?,?,?]', ['2006-03-28', 'BUY', 'IBM', 1000, 45.00]]
Chúng tôi đã chạm vào việc sử dụng các tham số trong bài đăng gần đây, vì vậy tôi muốn mở rộng về điều đó và hiển thị một ví dụ để bao gồm các biến trong các câu lệnh SQL. Nếu bạn không quen thuộc với việc thiết lập kết nối SQL trong Python, hãy xem bài đăng của chúng tôi được gọi là Cách kết nối SQL Server trong Python.
Hoặc nếu bạn đang tìm kiếm mysql hoặc mariadb hãy thử ở đây.
Trong nhiều trường hợp, bạn sẽ cần truy vấn cơ sở dữ liệu để tạo danh sách, tuple hoặc từ điển và sử dụng các kết quả đó để thực hiện một câu lệnh hoặc vòng lặp khác thông qua các giá trị.
Dưới đây là một bản tóm tắt nhanh chóng về các loại biến và bài tập. Bạn sẽ nhận thấy rằng các tên biến đều là chữ thường và các giá trị Boolean cũng nhạy cảm với trường hợp. Bạn không thể sử dụng tất cả các mũ như đúng hoặc sai cho các giá trị boolean. Đây là một bài tập đơn giản và cú pháp tương tự như hầu hết các ngôn ngữ.
## String:
app_name = "Some value for string"
app_name = 'Same using single quotes'
## Number:
num_tests = 214
## Decimal:
decimal_here = 23.18
## Boolean [1 or 0]:
is_enabled = True
is_enabled = False
Kết nối máy chủ SQL Python
Đối với ví dụ này, chúng tôi sẽ sử dụng mã kết nối trước đó và nhận các tham số từ các biến. Điều này làm cho cài đặt kết nối động và mã có thể tái sử dụng ngay cả trong cùng một ứng dụng. Tạo một kết nối mới bằng cách thay đổi các biến.
Đây là mã bắt đầu của chúng tôi trong đó các tham số đã được gán cho kết nối:
import pyodbc
conn_str = ["Driver={SQL Server};"
"Server=mysqlserver\sqlinst1;"
"Database=DBName;"
"UID=MyUser;"
"PWD=Pass123;"]
conn = pyodbc.connect[conn_str]
cursor = conn.cursor[]
cursor.execute["SELECT TOP[1000] * FROM sometable"]
for row in cursor:
print[row]
Trong ví dụ này, chúng tôi đang hiển thị cùng một kết nối với các tham số được đặt trong các biến thay thế. Chúng tôi sẽ để lại giá trị trình điều khiển cho SQL Server trong cú pháp của Conn Conn_STR, vì điều này không thể thay đổi thường xuyên.
Bây giờ chúng tôi chỉ định các biến và thêm chúng vào đối tượng kết nối của chúng tôi là tham số của chúng tôi vào kết nối.
import pyodbc
server= 'mysqlserver\sqlinst1'
db= 'DBName'
user= 'MyUser'
password= 'Pass123'
conn = pyodbc.connect["driver=SQL Server;server=%s;database=%s;uid=%s;pwd=%s" % [ server, db, user, password ] ]
cursor = conn.cursor[]
cursor.execute["SELECT * FROM SomeTable"]
for row in cursor:
print[row]
Lưu ý phần trăm Cú pháp dấu hiệu%của%và mã đang sử dụng một tuple để các tham số cần theo đúng thứ tự.
- %s - Chuỗi hoặc đối tượng chung
- %D - Số nguyên thập phân
- %f - float
- %g - số chung
Đây là ví dụ khá đơn giản, còn một môi trường lớn hơn nơi chúng tôi có tài khoản dịch vụ Active Directory?
Xác thực Windows
Nếu bạn làm việc trong một tên miền và bạn muốn sử dụng thông tin đăng nhập tên miền của người dùng, bạn có thể đặt tham số kết nối đáng tin cậy. Đây là những gì mã sẽ trông như thế nào:
import pyodbc
server= 'mysqlserver\sqlinst1'
db= 'DBName'
conn = pyodbc.connect["driver=SQL Server;Trusted_Connection=Yes;server=%s;database=%s" % [ server, db] ]
cursor = conn.cursor[]
cursor.execute["SELECT * FROM SomeTable"]
for row in cursor:
print[row]
Người dùng đang thực thi mã Python sẽ được sử dụng tự động để xác thực vào cơ sở dữ liệu.
Một giải pháp năng động hơn ở đây là gán cho kết nối đáng tin cậy cho một biến [DB Tales Com] để nó có thể là một tùy chọn từ bên trong ứng dụng. Bạn có thể chuyển từ người dùng đã đăng nhập sang người dùng và mật khẩu được xác định thông qua trang Cài đặt.
Biến môi trường Python
Thông thường các biến môi trường được sử dụng thay vì gán tĩnh. Đây là những biến tồn tại ở cấp hệ điều hành trong môi trường hiện tại bạn đang chạy. Để xem các biến này, bạn có thể chạy như sau:
import os
for i, j in os.environ.items[]:
print[i, j]
Tôi đã sử dụng nhiều trong số này trong các ứng dụng loại hành chính vì chúng cần tên máy hoặc tên máy tính, hay hom hompath ,, Java_home ,, Mô -đun HĐH cung cấp điều này vì vậy tôi không cần truy cập WMI thông qua một phương thức khác.
import os
user = os.environ['USERNAME']
computer = os.environ['COMPUTERNAME']
domain = os.environ['USERDOMAIN']
print[domain,user,computer]
Điều này có thể hữu ích cho việc thiết lập các mặc định trong ứng dụng cơ sở dữ liệu SQL của bạn, chẳng hạn như miền và thông tin đăng nhập cho mục đích bài đăng này.