Python đã trở nên phổ biến một cách bùng nổ trong 5 năm qua. Nhiều lập trình viên mới bị thu hút bởi vì đường cong học tập nhẹ nhàng của nó so với các ngôn ngữ lập trình khác. Các lập trình viên có kinh nghiệm bị thu hút bởi khả năng mở rộng và sức mạnh của nó. Tuy nhiên, một trong những động lực chính của việc áp dụng hàng loạt này là sự dễ dàng mà Python có thể làm việc với cơ sở dữ liệu. Hướng dẫn lập trình Python này sẽ khám phá cách bắt đầu sử dụng Python để giao tiếp với SQL Express bằng Python 3.
Lập trình Python và Cơ sở dữ liệu
Người mới bắt đầu Python muốn tích hợp chức năng cơ sở dữ liệu vào bất kỳ dự án phần mềm được viết bằng bất kỳ ngôn ngữ phải có hiểu biết cơ bản ít nhất là hai ngôn ngữ. Tất nhiên, thứ nhất là Python và thứ hai là ngôn ngữ truy vấn có cấu trúc cụ thể (SQL) được sử dụng bởi cơ sở dữ liệu. Mặc dù SQL được chuẩn hóa, trên thực tế, nó không phải là một ngôn ngữ chung, nhưng việc triển khai giữa các cơ sở dữ liệu khác nhau đủ gần để việc chuyển từ cơ sở dữ liệu này sang cơ sở dữ liệu khác không phải là một thách thức nhiều khi một người đã có kinh nghiệm phát triển ứng dụng cơ sở dữ liệu ở mức độ thoải mái.
Một xem xét quan trọng khác đối với cơ sở dữ liệu là chúng đều yêu cầu phần mềm quản lý. Các công cụ quản lý này có thể hỗ trợ thiết lập quyền truy cập và các đặc quyền bảo mật trong cơ sở dữ liệu. Chúng cũng có thể được sử dụng để gỡ lỗi các ứng dụng cơ sở dữ liệu vì chúng có thể cho phép nhà phát triển thực hiện những việc như:
- Tạo và quản lý nội dung của bảng, dạng xem và các đối tượng cơ sở dữ liệu khác. Điều này bao gồm mối quan hệ giữa các bảng, cũng như cấu hình các quy tắc toàn vẹn.
- Tương tác trực tiếp với cơ sở dữ liệu thông qua mục nhập mã SQL.
- Gỡ lỗi cú pháp SQL.
- Hoàn tác (ở một mức độ) thiệt hại do các câu lệnh SQL được mã hóa không chính xác trong ứng dụng.
Ngay cả khi nhà phát triển chọn sử dụng cơ sở dữ liệu dựa trên noSQL như MongoDB, vẫn sẽ có những thách thức trong việc học cú pháp mã hóa dành riêng cho cơ sở dữ liệu cần thiết để làm cho một giải pháp như vậy hoạt động. Tất nhiên, đây không phải là những yếu tố cản trở, chúng chỉ là những yếu tố kỹ thuật cần được xem xét đối với bất kỳ dự án phát triển phần mềm nào.
Trình điều khiển cơ sở dữ liệu và Python
Python, giống như bất kỳ ngôn ngữ lập trình nào khác, không thể giao tiếp tự nhiên với một cơ sở dữ liệu nhất định. Nó yêu cầu thêm các mô-đun bổ sung cho một máy chủ cơ sở dữ liệu cụ thể. Từ quan điểm thực tiễn tốt nhất, tốt nhất là sử dụng mô-đun trình điều khiển cơ sở dữ liệu dành riêng cho máy chủ cơ sở dữ liệu được chọn cho dự án phần mềm. Làm như vậy đảm bảo rằng Python có thể truy cập tất cả các tính năng của máy chủ cơ sở dữ liệu, ngay cả khi phải trả thêm chi phí khi sử dụng một cú pháp lập trình cụ thể cho mô-đun. Mặc dù một số nỗ lực đã được thực hiện để tạo các mô-đun trình điều khiển cơ sở dữ liệu “phổ quát” có thể kết nối với nhiều máy chủ cơ sở dữ liệu, nhưng chúng thường phải trả giá bằng việc mất quyền truy cập vào các tính năng nhất định của một máy chủ cơ sở dữ liệu cụ thể.
SQL Express là gì?
SQL Server đã là giải pháp máy chủ cơ sở dữ liệu dành cho Windows trong nhiều thập kỷ. Mặc dù còn khoảng cách rất xa so với một giải pháp máy chủ cơ sở dữ liệu miễn phí mà người ta có thể nhận được, nhưng Microsoft vẫn cung cấp một biến thể rút gọn của SQL Server được gọi là SQL Express. SQL Express là một công cụ học tập lý tưởng cho người mới bắt đầu vì nó hỗ trợ cùng một cú pháp SQL mà SQL Server sử dụng. Cả SQL Express và SQL Server đều sử dụng một phần mở rộng tùy chỉnh của SQL được gọi là “Transact-SQL”, còn được gọi là “T-SQL”. Cả SQL Express và SQL Server đều hỗ trợ việc sử dụng tài khoản người dùng Windows cũng như hệ thống tên người dùng và mật khẩu truyền thống để quản lý truy cập.
Python giao tiếp với SQL Express hoặc SQL Server bằng mô-đun có tên PyODBC . Cả SQL Server và SQL Express đều được quản lý bởi một ứng dụng Windows riêng biệt, miễn phí có tên “Hệ thống quản lý máy chủ SQL”, thường được gọi là “SSMS”. Tại thời điểm viết bài này, cả SQL Express và SSMS đều là các bản tải xuống riêng biệt từ Microsoft:
- Tải xuống SSMS
- Tải xuống SQL Express
Cách định cấu hình SQL Express để phát triển Python
SQL Express, giống như SQL Server, hỗ trợ hai loại xác thực. Đầu tiên là xác thực dựa trên Tài khoản Người dùng Windows của người dùng, còn được gọi là “Kết nối đáng tin cậy”. Thứ hai là tên người dùng truyền thống và xác thực dựa trên mật khẩu được thực hiện trong cái được gọi là “Xác thực chế độ hỗn hợp”. Xác thực Chế độ Hỗn hợp hỗ trợ cả xác thực dựa trên Tài khoản Người dùng Windows và xác thực dựa trên tên người dùng và mật khẩu. Không có cách nào hỗ trợ xác thực dựa trên tên người dùng và mật khẩu trong SQL Server hoặc SQL Express.
Microsoft đã loại bỏ Xác thực Chế độ Hỗn hợp, vì một trong những lợi thế chính của việc sử dụng Kết nối Tin cậy là thông tin xác thực cơ sở dữ liệu không cần phải được lưu trữ trong mã ứng dụng. Trình diễn trong bài viết này cũng sẽ không sử dụng nó.
KHÔNG sao chép chuỗi kết nối sau khi cài đặt
Một điểm gây tranh cãi đối với các nhà phát triển ứng dụng cấp độ mới bắt đầu là sự nhầm lẫn ban đầu xung quanh các chuỗi kết nối SQL Server. Nếu một người đang cài đặt SQL Express, chương trình cài đặt sẽ cung cấp chuỗi kết nối cho phiên bản SQL Express đã tạo sau cài đặt. Rất tiếc, Chuỗi kết nối được cung cấp có khả năng không hoạt động với PyODBC . Mặc dù bị “ru ngủ” vào cảm giác an toàn với “người miễn phí” này rất hấp dẫn, nhưng nó sẽ gây ra nhiều rắc rối hơn mức đáng có.
Hình 1 - Lấy chuỗi kết nối từ trình cài đặt SQL Express
Lưu ý rằng, tại thời điểm viết bài này, chương trình cài đặt cho SQL Express cũng bao gồm một liên kết để tải xuống chương trình cài đặt SSMS.
Cách tạo cơ sở dữ liệu trong SQL Express
Khi cả SQL Express và SSMS đều được cài đặt, đã đến lúc tạo một cơ sở dữ liệu cơ bản với các hạn chế truy cập phù hợp. Cách dễ nhất để bắt đầu SSMS là nhấp vào Bắt đầu trong Windows, nhập “ssms” vào thanh tìm kiếm, đợi “Microsoft SQL Server Management Studio 18” xuất hiện ở phía trên bên phải, sau đó nhấp vào nút Mở ở phía bên phải của bảng menu Start:
Hình 2 - Khởi động SSMS
Khi khởi động SSMS, một người được chào đón bằng hộp thoại sau:
Hình 3 - Hộp thoại Mở SSMS
Với Xác thực Windows, không cần nhập bất kỳ thông tin đăng nhập nào. Tài khoản Người dùng Windows theo đó SQL Express đã được cài đặt có đặc quyền quản trị cho phiên bản SQL Express. Chỉ cần nhấp vào Kết nối để tiếp tục.
Ở phía ngoài cùng bên trái của Cửa sổ ứng dụng SSMS , sẽ có Trình khám phá đối tượng . Để tạo cơ sở dữ liệu mới, nhấp chuột phải vào Cơ sở dữ liệu và chọn Tạo Cơ sở dữ liệu từ Ngữ cảnh menu:
Hình 4 - Tạo cơ sở dữ liệu mới - Phần 1 của 2
Nhấp vào Cơ sở dữ liệu mới… sẽ mở một cửa sổ hộp thoại mới cho phép nhập các thông tin chi tiết của cơ sở dữ liệu mới. Đối với phần trình diễn này, cơ sở dữ liệu sẽ được gọi là RazorDemo , như một phần quay lại bài viết trước về việc phát triển các ứng dụng dựa trên Razor trong C #. Nhập tên của cơ sở dữ liệu vào hộp văn bản bên cạnh Tên cơ sở dữ liệu và sau đó nhấp vào OK ở cuối cửa sổ hộp thoại. Lưu ý rằng, trong hình minh họa bên dưới, các cột cho Tên lôgic trong số các tệp đã được mở rộng một chút để có đầy đủ Tên lôgic trong số các tệp cơ sở dữ liệu đang được tạo đã bị lộ:
Hình 5 - Tạo Cơ sở dữ liệu Mới - Phần 2 của 2
Cơ sở dữ liệu mới sau đó sẽ xuất hiện trong Trình khám phá đối tượng trong Cơ sở dữ liệu thư mục:
Hình 6 - Cơ sở dữ liệu “RazorDemo” mới được tạo
Cách tạo bảng trong SQL Express
Cơ sở dữ liệu quan hệ không thực sự hữu ích nếu không có các bảng để lưu trữ dữ liệu và cách đơn giản nhất để tạo các bảng đó là sử dụng mã SQL. Lưu ý, mặc dù người ta có thể sử dụng Trình hướng dẫn Tạo Bảng để tạo một bảng, sử dụng mã SQL nhanh hơn, dễ dàng hơn và đơn giản hơn rất nhiều. Bắt đầu bằng cách nhấp chuột phải vào RazorDemo nhập cơ sở dữ liệu, sau đó nhấp chuột trái vào Truy vấn Mới trong cửa sổ ngữ cảnh:
Hình 7 - Mở Cửa sổ Truy vấn Mới
Cửa sổ trình chỉnh sửa truy vấn tương tự như bên dưới sẽ xuất hiện ở bên phải của Trình khám phá đối tượng :
Hình 8 - Cửa sổ trình soạn thảo truy vấn
Mã tạo bảng được hiển thị trong danh sách dưới đây:
use RazorDemo; # See the Important Note below create table artists (rcdid int not null identity primary key, artist_name varchar(max)); create table albums (rcdid int not null identity primary key, artist_id int not null references artists(rcdid) on delete cascade, album_name varchar(max)); Listing 1 - Table Creation SQL Code
Lưu ý, trong khi tạo Cửa sổ trình soạn thảo truy vấn từ cơ sở dữ liệu thường đảm bảo rằng cơ sở dữ liệu đã chọn sẽ là cơ sở dữ liệu mà mã được thực thi, bạn nên luôn sử dụng một cách rõ ràng cơ sở dữ liệu dự định ở đầu mã. Việc sử dụng lệnh chọn rõ ràng tên của cơ sở dữ liệu theo sau nó.
Nhấn F5 hoặc nhấp vào Thực thi nút sẽ thực thi các câu lệnh đối với RazorDemo cơ sở dữ liệu. Nếu quá trình thực thi thành công, một thông báo cho biết như vậy sẽ xuất hiện trong “ Thông báo hộp bên dưới:
Hình 9 - Tạo bảng thành công
Các bảng mới được tạo và các cột của chúng có thể được nhìn thấy trong Trình khám phá đối tượng cũng. Lưu ý rằng đôi khi Làm mới tùy chọn từ menu ngữ cảnh xuất hiện khi nhấp chuột phải vào cơ sở dữ liệu có thể cần được chọn để hiển thị các đối tượng mới trong cơ sở dữ liệu:
Hình 10 - Làm mới Trình khám phá đối tượng
Hình 11 - Các bảng mới và cột của chúng
Tại thời điểm này, SSMS có thể được đóng một cách an toàn.
Lưu ý rằng SSMS cũng hoạt động theo cùng một cách với bất kỳ cơ sở dữ liệu SQL Server nào. Luôn luôn là một phương pháp hay nhất để lưu tất cả mã tạo bảng bất kể máy chủ cơ sở dữ liệu nào đang được sử dụng. Mặc dù SQL Server và SQL cho phép khôi phục các tập lệnh như vậy, cả hai đều cho phép sử dụng mã hóa trên các câu lệnh như vậy và trong những trường hợp đó, mã không thể được khôi phục.
Python và SQL Express
Thông thường, một cuộc thảo luận về bảo mật SQL Server sẽ cần thiết ở đây, nhưng vì Kết nối đáng tin cậy sẽ được sử dụng, miễn là quá trình đang chạy thực thi mã Python thuộc sở hữu của Người dùng Windows đã có quyền truy cập vào cơ sở dữ liệu đang được truy cập, cuộc thảo luận đó sẽ không cần thiết. Hãy nhớ rằng cả SQL Server và SQL Express đều cung cấp các tùy chỉnh liên quan đến bảo mật rất mạnh mẽ, nhưng những tùy chỉnh đó nằm ngoài phạm vi của một bài viết dành cho người mới bắt đầu.
Lưu ý, không che giấu bảo mật cơ sở dữ liệu thích hợp cho bất kỳ ứng dụng nào chạy trong môi trường sản xuất! Đảm bảo rằng chỉ những đặc quyền ít nhất có thể được cấp cho tài khoản người dùng có thể truy cập cơ sở dữ liệu trong môi trường chiếu.
Phiên bản Python được sử dụng cho các ví dụ mã này là 3.10 và nó đã được cài đặt thông qua Microsoft Store trong Windows. Cài đặt Python bằng phương pháp này sẽ thêm các tệp thực thi Python và PIP3 vào đường dẫn hệ thống, do đó các đường dẫn đầy đủ đến các lệnh này sẽ không cần phải nhập vào Command Prompt các cửa sổ. Đối với mục nhập mã, một trình soạn thảo văn bản tốt, không tốn phí là Notepad ++.
Mở Command Prompt Windows
Việc thực thi mã Python được thực hiện tốt nhất thông qua Command Prompt . Để truy cập vào Command Prompt , nhấp vào Bắt đầu trong Windows và nhập cmd vào thanh tìm kiếm. Chờ Command Prompt xuất hiện và sau đó nhấp vào Mở ở phía bên phải của Start Menu :
Hình 12 - Mở Command Prompt
Command Prompt điển hình cửa sổ trông như thế này:
Hình 13 - Dấu nhắc lệnh điển hình
Cách cài đặt PyODBC
PyODBC là mô-đun Python cho phép Python truy cập cả SQL Server và SQL Express. Sau khi cài đặt Python qua Microsoft Store, PyODBC có thể được thêm vào Python thông qua lệnh:
pip3 install pyodbc
Hình 14 - Cài đặt thành công PyODBC
Lưu ý, nếu có nhiều phiên bản Python được cài đặt, chẳng hạn như cả Python 2 và Python 3, thì có thể cần thêm tiền tố pip3 lệnh với đường dẫn WIndows đầy đủ để ra lệnh cho phiên bản Python thích hợp.
Cũng lưu ý rằng nếu chỉ có Python 3 được cài đặt, thì pip3 lệnh vẫn nên được sử dụng trên pip chung chung hơn lệnh, vì đây là quy ước thích hợp.
Viết mã Python
Bây giờ cơ sở dữ liệu đã được định cấu hình và PyODBC được cài đặt, cơ sở dữ liệu có thể được phổ biến. Trong trường hợp cơ sở dữ liệu liệt kê các nghệ sĩ và album, một số tên ban nhạc và album được tạo ngẫu nhiên là đủ. Mã Python để kết nối với cơ sở dữ liệu cũng được bao gồm, nhưng phần chèn thì chưa (chưa):
# bad-band-name-maker.py import sys import random import pyodbc part1 = ["The", "Uncooked", "Appealing", "Larger than Life", "Drooping", "Unwell", "Atrocious", "Glossy", "Barrage", "Unlawful"] part2 = ["Defeated", "Hi-Fi", "Extraterrestrial", "Adumbration", "Limpid", "Looptid", "Cromulent", "Unsettled", "Soot", "Twinkle"] part3 = ["Brain", "Segment", "Audio", "Legitimate Business", "Mentality", "Sound", "Canticle", "Monsoon", "Preserves", "Hangout"] part4 = ["Cougar", "Lion", "Lynx", "Ocelot", "Puma", "Jaguar", "Panther"] part5 = ["Fodder", "Ersatz Goods", "Leftovers", "Infant Formula", "Mush", "Smoothie", "Milkshakes"] def main(argv): # Connect to the RazorDemo database. conn = pyodbc.connect("Driver={ODBC Driver 17 for SQL Server};Server=localhost\SQLEXPRESS;Database=RazorDemo;Trusted_Connection=yes;") # Generate 15 bad band names: for x in range(1, 16): rand1 = random.randrange(0, 9) rand2 = random.randrange(0, 9) rand3 = random.randrange(0, 9) badName = part1[rand1] + ' ' + part2[rand2] + ' ' + part3[rand3] print ("Band name [" + str(x) + "] is [" + badName + "]") for y in range(1, 3): rand4 = random.randrange(0, len(part4)) rand5 = random.randrange(0, len(part5)) albumName = part4[rand4] + " " + part5[rand5] print ("\tAlbum [" + albumName + "]") # Close the Connection conn.close() return 0 if __name__ == "__main__": main(sys.argv[1:]) Listing 2 - Making up some data
Điều này cho kết quả sau:
Hình 15 - Tên băng tần được tạo ngẫu nhiên
Lưu ý việc sử dụng cd lệnh để thay đổi thư mục lưu mã Python. PyODBC kết nối () chức năng sẽ không thành công nếu Tài khoản Người dùng Windows hiện đang đăng nhập không được liệt kê là có quyền truy cập trong SQL Express. Đây chỉ là sự cố nếu cơ sở dữ liệu được tạo bằng một Tài khoản Người dùng Windows nhưng mã được chạy trong một Tài khoản Người dùng Windows khác .
Cách tồi tệ nhất để CHÈN Dữ liệu trong SQL và PyODBC
Nhiều nhà phát triển Python mới bắt đầu bị cám dỗ để thực hiện các cuộc gọi đến PyODBC cuộc gọi đến INSERT trong các phần sau của mã và trong ngữ cảnh của những gì sẽ được trình bày tiếp theo, đây không phải là một ý tưởng tồi:
Hình 16 - Cách "gần như sai" để làm việc với cơ sở dữ liệu
Lý do tại sao sử dụng lệnh gọi tới PyODBC để thực hiện INSERTs , CHỌN và các chức năng khác liên quan đến cơ sở dữ liệu, chẳng hạn như CẬP NHẬT hoặc XÓA , trong các vòng lặp có thể là không tốt vì có chi phí đi kèm với mỗi cuộc gọi này. Trong một vòng lặp có khả năng lặp lại hàng trăm lần, hàng nghìn lần hoặc thậm chí nhiều hơn, điều này có thể dẫn đến một lượng thời gian đáng kể (phút hoặc hơn) để chạy qua một tập lệnh. Đối với các ứng dụng web sử dụng cách tiếp cận như vậy, các vấn đề về hiệu suất còn tăng thêm, vì nhiều máy chủ web áp đặt giới hạn cứng về lượng thời gian mà một tập lệnh có thể chạy. Không bao giờ trong bất kỳ trường hợp nào chuyển trực tiếp đầu vào do người dùng tạo vào cơ sở dữ liệu. Luôn kiểm tra đầu vào để đảm bảo rằng nó sẽ không phá vỡ chức năng cơ sở dữ liệu hoặc gây ra sự cố bảo mật do tấn công SQL Injection.
Lý tưởng nhất là người ta muốn sử dụng các vòng ở trên để tạo SQL Batch (danh sách các câu lệnh) và sau đó có PyODBC chạy trên một lô duy nhất đó, nhưng đây sẽ là một ý tưởng rất tồi nếu dữ liệu không được làm sạch.
Tại sao dữ liệu cần được làm sạch? Lý do nằm ở vấn đề bảo mật, vì thông tin đầu vào của người dùng không bao giờ có thể tin cậy được. Dọn dẹp dữ liệu có nghĩa là đại diện cho dữ liệu theo cách ngăn không cho bất kỳ điều gì khác ngoài câu lệnh SQL do nhà phát triển chương trình tạo ra không được thực thi. Người dùng có thể chuyển một chuỗi được xây dựng độc hại cho phép thực thi mã SQL được tạo tùy ý. Đây được gọi là một cuộc tấn công SQL Injection. Mặc dù các giá trị dữ liệu đi vào một lô có thể được làm sạch, nhưng quá trình làm như vậy nằm ngoài phạm vi của một hướng dẫn giới thiệu.
PyODBC cung cấp một cơ chế để bảo vệ cơ sở dữ liệu khỏi các cuộc tấn công SQL Injection bằng cách làm sạch đầu vào của người dùng. Những điều này liên quan đến việc sử dụng câu lệnh được tham số hóa , còn được gọi là báo cáo chuẩn bị sẵn sàng . Bảo mật phải luôn được ưu tiên, ngay cả khi nó phải trả giá bằng tốc độ hoặc các chỉ số hiệu suất khác.
Theo mặc định, Tài khoản Người dùng Windows có quyền truy cập vào cơ sở dữ liệu này có đặc quyền sysadmin. Điều này có nghĩa là nếu một cuộc tấn công SQL Injection xảy ra, một người dùng độc hại có thể giành được quyền truy cập vào tất cả dữ liệu trong mọi cơ sở dữ liệu trên máy chủ. Trên thực tế, không có tài khoản nào có đặc quyền sysadmin có thể truy cập bất kỳ cơ sở dữ liệu nào từ mã Python.
Danh sách bên dưới bổ sung thêm ví dụ mã Python đầu tiên bằng cách sử dụng PyODBC con trỏ để chèn dữ liệu:
# bad-band-name-maker2.py import sys import random import pyodbc part1 = ["The", "Uncooked", "Appealing", "Larger than Life", "Drooping", "Unwell", "Atrocious", "Glossy", "Barrage", "Unlawful"] part2 = ["Defeated", "Hi-Fi", "Extraterrestrial", "Adumbration", "Limpid", "Looptid", "Cromulent", "Unsettled", "Soot", "Twinkle"] part3 = ["Brain", "Segment", "Audio", "Legitimate Business", "Mentality", "Sound", "Canticle", "Monsoon", "Preserves", "Hangout"] part4 = ["Cougar", "Lion", "Lynx", "Ocelot", "Puma", "Jaguar", "Panther"] part5 = ["Fodder", "Ersatz Goods", "Leftovers", "Infant Formula", "Mush", "Smoothie", "Milkshakes"] def main(argv): # Connect to the RazorDemo database. conn = pyodbc.connect("Driver={ODBC Driver 17 for SQL Server};Server=localhost\SQLEXPRESS;Database=RazorDemo;Trusted_Connection=yes;") # Generate 15 bad band names, and try to keep them unique. previousNames = "" nameCount = 0 while (nameCount < 16): rand1 = random.randrange(0, 9) rand2 = random.randrange(0, 9) rand3 = random.randrange(0, 9) badName = part1[rand1] + ' ' + part2[rand2] + ' ' + part3[rand3] # A crude but effective way of ensuring uniqueness, although there is no unique constraint on the artist name in the database. # This prepends and appends bars to both the list of previously used names and the current name. If the current name is # new, it will not be in that string. if ("|" + previousNames + "|").find("|" + badName + "|") == -1: print ("Band name [" + str(nameCount) + "] is [" + badName + "]") sql1 = "insert into artists (artist_name) values (?)" values1 = [badName] rs1 = conn.cursor() rs1.execute(sql1, values1) rs1.commit() # If the cursor is not closed, then other cursors cannot be executed. rs1.close() for y in range(1, 3): rand4 = random.randrange(0, len(part4)) rand5 = random.randrange(0, len(part5)) albumName = part4[rand4] + " " + part5[rand5] print ("\tAlbum [" + albumName + "]") sql2 = "insert into albums (artist_id, album_name) values ((select top 1 rcdid from artists where artist_name=?), ?)" # Each array item here corresponds to the position of the ? in the SQL statement above. values2 = [badName, albumName] rs2 = conn.cursor () rs2.execute(sql2, values2) rs2.commit() rs2.close() # Creates a bar-delimited list of previously used names. if previousNames == "": previousNames = badName else: previousNames = previousNames + "|" + badName nameCount = 1 + nameCount else: print ("Found a duplicate of [" + badName + "]") #print (previousNames) # Close the Connection conn.close() return 0 if __name__ == "__main__": main(sys.argv[1:]) Listing 3 - Inserting the data
Truy vấn sau có thể được chạy trong SSMS để xác minh đầu ra của mã:
Hình 17 - Chèn thành công dữ liệu
CHỌN Dữ liệu trong SQL Express và Python
Bây giờ có dữ liệu trong cơ sở dữ liệu, sẽ rất tuyệt nếu bạn truy vấn nó. Dưới đây là một tập lệnh đơn giản chấp nhận dữ liệu người dùng từ bàn phím chuyển dữ liệu đó vào cơ sở dữ liệu thông qua truy vấn được tham số hóa:
# bad-band-name-maker3.py import sys import pyodbc def main(argv): searchValue = input("Enter something: ") # Cap the length at something reasonable. The first 20 characters. searchValue = searchValue[0:20] # Set the search value to lower case so we can perform case-insensitive matching: searchValue = searchValue.lower() # Connect to the RazorDemo database. conn = pyodbc.connect("Driver={ODBC Driver 17 for SQL Server};Server=localhost\SQLEXPRESS;Database=RazorDemo;Trusted_Connection=yes;") # You must use a parameterized query here in order to protect from SQL Injection Attacks! # For the like operator, the percent signs must be separated from the term or else the parameterization will fail. sql1 = ("select a.artist_name, b.album_name from artists a, albums b where b.artist_id = a.rcdid and " + "lower(album_name) like ('%' + ? + '%') order by a.artist_name, b.album_name") # Below is an array with one element: values1 = [searchValue] rs1 = conn.cursor() rs1.execute(sql1, values1) rows1 = rs1.fetchone() #print ("Type is [" + str(type(rows1)) + "]") if str(type(rows1)).find("NoneType") == -1: while rows1: # Columns are indexed by number only. 0 is the a.artist_name column and 1 is the b.album_name columns print(rows1[0] + " - " + rows1[1]) rows1 = rs1.fetchone() else: print ("No album name matched [" + searchValue + "]") # Close the Connection conn.close() return 0 if __name__ == "__main__": main(sys.argv[1:]) Listing 4 - Querying the Data
Kết quả tương tự. Một thậm chí còn bao gồm một ví dụ về một cuộc tấn công SQL Injection thô thiển:
Hình 18 - Kết quả truy vấn. Lưu ý giá trị tìm kiếm cuối cùng.
Kết luận về phát triển cơ sở dữ liệu Python
Thực sự không có giới hạn nào đối với những ứng dụng do SQL Server điều khiển có thể được phát triển bằng Python. Một nhà phát triển chỉ bị giới hạn bởi kiến thức về SQL và hy vọng rằng các khái niệm cơ bản được trình bày trong bài viết này có thể chỉ ra một nhà phát triển cấp độ mới bắt đầu đi đúng hướng khi mở rộng hiểu biết của một người về SQL và xây dựng các ứng dụng phức tạp hơn.
Hướng dẫn lập trình cơ sở dữ liệu Python này được trình bày có nghĩa là SQL Express có thể được cài đặt như một dự phòng phát triển cho SQL Server và chỉ ra cách Python 3 có thể được mở rộng để giao tiếp chính xác với phiên bản cơ sở dữ liệu SQL Express trên máy chủ đó. Bài viết này cũng chỉ ra cách sử dụng SQL Server Management Studio để quản lý bất kỳ cơ sở dữ liệu SQL Express hoặc SQL Server nào. Đi sâu hơn, bài viết này cũng đề cập đến các biện pháp phòng ngừa bảo mật cơ bản và việc sử dụng mã hóa hiệu quả nhằm mục đích đảm bảo thời gian thực thi hợp lý cho các ứng dụng do SQL Server điều khiển.