Cách truyền đối số cho truy vấn sql trong tập lệnh python

Chúng tôi đã đề cập đến 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ấn đề đó và hiển thị một ví dụ về việc bao gồm các biến trong câu lệnh SQL. Nếu bạn không quen 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ó tên Cách kết nối máy chủ SQL trong Python

Hoặc nếu bạn đang tìm kiếm MySQL hoặc MariaDB Hãy thử tại đâ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, Bộ hoặc Từ điển và sử dụng các kết quả đó để thực hiện một câu lệnh khác hoặc lặp qua các giá trị

Biến Python

Dưới đây là tóm tắt nhanh về các loại biến và phép gán. 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 phân biệt chữ hoa chữ thường. Bạn không thể sử dụng tất cả các chữ hoa như TRUE hoặc FALSE cho các giá trị boolean. Đây là một nhiệm vụ đơ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ủ Python SQL

Đối với ví dụ này, chúng tôi sẽ sử dụng mã kết nối trước đó và lấy 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, nơi 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 vì. Chúng tôi sẽ để giá trị Trình điều khiển cho SQL Server trong cú pháp “conn_str” vì không chắc điều này sẽ được thay đổi thường xuyên

Bây giờ chúng ta gán các biến và thêm chúng vào đối tượng kết nối “conn” của chúng ta làm tham số cho 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 ý cú pháp ký hiệu phần trăm “%” và mã đang sử dụng Tuple nên các tham số cần phải theo đúng thứ tự

  • %s – chuỗi hoặc đối tượng chung
  • %d – số nguyên thập phân
  • %f – thả nổi
  • %g – số chung

Đây là một ví dụ khá đơn giản, còn môi trường lớn hơn nơi chúng ta có các tài khoản dịch vụ Active Directory thì sao?

Xác thực Windows

Nếu bạn đang làm việc trong một miền và bạn muốn sử dụng thông tin xác thực miền của người dùng đã đăng nhập, 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 cơ sở dữ liệu

Một giải pháp năng động hơn ở đây là gán “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 đã xác định thông qua trang cài đặt

Biến môi trường Python

Thường thì 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 Quản trị khi chúng cần tên máy hoặc “COMPUTERNAME” hoặc “HOMEPATH”, “JAVA_HOME”, “PYTHONPATH”, “USERDOMAIN” hoặc “USERNAME”. Mô-đun os cung cấp tính năng này nên tôi không cần truy cập WMI thông qua 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 để đặt mặc định trong ứng dụng cơ sở dữ liệu SQL của bạn, chẳng hạn như thông tin Tên miền và Đăng nhập cho mục đích đăng bài này