Làm cách nào để nhận kết quả SQL bằng Python?
Để kết thúc, chúng ta hãy xem cách truy cập cơ sở dữ liệu từ ngôn ngữ lập trình đa năng như Python. Các ngôn ngữ khác sử dụng gần như chính xác cùng một mô hình. tên thư viện và chức năng có thể khác nhau, nhưng các khái niệm là như nhau Show
Đây là một chương trình Python ngắn chọn vĩ độ và kinh độ từ cơ sở dữ liệu SQLite được lưu trữ trong một tệp có tên 7
Chương trình bắt đầu bằng cách nhập thư viện 8. Nếu chúng tôi đang kết nối với MySQL, DB2 hoặc một số cơ sở dữ liệu khác, chúng tôi sẽ nhập một thư viện khác, nhưng tất cả chúng đều cung cấp các chức năng giống nhau, do đó phần còn lại của chương trình của chúng tôi không phải thay đổi (ít nhất là không nhiều) nếu Dòng 2 thiết lập kết nối đến cơ sở dữ liệu. Vì chúng tôi đang sử dụng SQLite, tất cả những gì chúng tôi cần chỉ định là tên của tệp cơ sở dữ liệu. Các hệ thống khác cũng có thể yêu cầu chúng tôi cung cấp tên người dùng và mật khẩu. Dòng 3 sau đó sử dụng kết nối này để tạo một. Giống như con trỏ trong trình soạn thảo, vai trò của nó là theo dõi xem chúng ta đang ở đâu trong cơ sở dữ liệu Trên dòng 4, chúng tôi sử dụng con trỏ đó để yêu cầu cơ sở dữ liệu thực hiện truy vấn cho chúng tôi. Truy vấn được viết bằng SQL và được chuyển tới 9 dưới dạng một chuỗi. Công việc của chúng tôi là đảm bảo rằng SQL được định dạng đúng; Cơ sở dữ liệu trả về kết quả của truy vấn cho chúng tôi để đáp lại lệnh gọi 0 trên dòng 5. Kết quả này là một danh sách có một mục cho mỗi bản ghi trong tập hợp kết quả; Cuối cùng, các dòng 8 và 9 đóng con trỏ và kết nối của chúng ta, vì cơ sở dữ liệu chỉ có thể giữ một số lượng hạn chế những thứ này mở cùng một lúc. Tuy nhiên, vì việc thiết lập kết nối cần có thời gian nên chúng ta không nên mở kết nối, thực hiện một thao tác, sau đó đóng kết nối, chỉ để mở lại vài micro giây sau đó để thực hiện thao tác khác. Thay vào đó, việc tạo một kết nối luôn mở trong suốt thời gian tồn tại của chương trình là điều bình thường Các truy vấn trong các ứng dụng thực thường sẽ phụ thuộc vào các giá trị do người dùng cung cấp. Ví dụ: hàm này lấy ID của người dùng làm tham số và trả về tên của họ
Chúng tôi sử dụng phép nối chuỗi trên dòng đầu tiên của chức năng này để tạo truy vấn chứa ID người dùng mà chúng tôi đã được cung cấp. Điều này có vẻ đủ đơn giản, nhưng điều gì sẽ xảy ra nếu ai đó đưa cho chúng ta chuỗi này làm đầu vào? ________số 8 Có vẻ như có rác sau ID người dùng, nhưng đó là rác được lựa chọn rất cẩn thận. Nếu chúng tôi chèn chuỗi này vào truy vấn của mình, kết quả là
Nếu chúng tôi thực hiện điều này, nó sẽ xóa một trong các bảng trong cơ sở dữ liệu của chúng tôi Đây được gọi là , và nó đã được sử dụng để tấn công hàng nghìn chương trình trong nhiều năm. Đặc biệt, nhiều trang web lấy dữ liệu từ người dùng chèn trực tiếp giá trị vào truy vấn mà không kiểm tra kỹ trước. Vì một kẻ xấu có thể cố gắng đưa lệnh vào các truy vấn của chúng ta theo nhiều cách khác nhau, nên cách an toàn nhất để đối phó với mối đe dọa này là thay thế các ký tự như dấu ngoặc kép bằng các ký tự thoát tương đương của chúng, để chúng ta có thể đặt bất kỳ thứ gì mà người dùng đưa cho chúng ta vào trong một chuỗi một cách an toàn. Chúng ta có thể làm điều này bằng cách sử dụng a thay vì định dạng câu lệnh của mình dưới dạng chuỗi. Đây là chương trình ví dụ của chúng tôi trông như thế nào nếu chúng tôi làm điều này 0
Các thay đổi chính nằm trong chuỗi truy vấn và lệnh gọi 1. Thay vì tự định dạng truy vấn, chúng tôi đặt dấu chấm hỏi trong mẫu truy vấn nơi chúng tôi muốn chèn giá trị. Khi chúng tôi gọi 1, chúng tôi cung cấp một danh sách chứa nhiều giá trị bằng số dấu chấm hỏi trong truy vấn. Thư viện khớp các giá trị với các dấu chấm hỏi theo thứ tự và dịch bất kỳ ký tự đặc biệt nào trong các giá trị thành các ký tự thoát tương đương để chúng an toàn khi sử dụngChúng tôi cũng có thể sử dụng con trỏ của 8 để thay đổi cơ sở dữ liệu của mình, chẳng hạn như chèn tên mới. Chẳng hạn, chúng ta có thể định nghĩa một hàm mới có tên là 4 như vậy 6 7Lưu ý rằng trong các phiên bản của sqlite3 >= 2. 5, hàm 5 được mô tả ở trên sẽ không thành công với 6, mặc dù chúng tôi đã thêm mục nhập của Mary vào bảng bằng cách sử dụng 4. Điều này là do chúng tôi phải thực hiện 8 trước khi đóng kết nối, để lưu các thay đổi của chúng tôi vào cơ sở dữ liệu 0 1
|