Giao diện kết nối cơ sở dữ liệu Tcl Nội dung chương Nội dung chính " Bản quyền © 2017 Ashok P. Nadkarni. Đã đăng ký Bản quyền Đây là một chương nháp từ cuốn sách Ngôn ngữ lập trình Tcl, hiện đã có ở dạng in và điện tử từ Amazon, Gumroad và những người khác1. Giới thiệuTiện ích mở rộng Kết nối cơ sở dữ liệu Tcl (TDBC) cung cấp API Tcl để truy cập cơ sở dữ liệu SQL. Vì API này độc lập với hệ thống cơ sở dữ liệu cơ bản nên hầu hết [] mã truy cập cơ sở dữ liệu trong một ứng dụng có thể chạy không thay đổi giữa các lần triển khai cơ sở dữ liệu khác nhau Một chút về lịch sử TDBC 1. 0, tác giả Kevin B. Kenny, đã được phát hành với Tcl 8. 6. Trước khi phát hành, việc thiếu API truy cập cơ sở dữ liệu Tcl tiêu chuẩn dẫn đến một số tiện ích mở rộng với các giao diện khác nhau bao gồm tclodbc để kết nối với cơ sở dữ liệu bằng ODBC DIO là một phần của Apache Rivet nstcl và nsdbi, cả hai đều bắt nguồn từ máy chủ web AOL Server Các tiện ích mở rộng dành riêng cho cơ sở dữ liệu khác nhau như oratcl cho Oracle và pgtcl cho PostgreSQL
Với sự ra đời của TDBC, giờ đây các ứng dụng có thể dựa vào giao diện chuẩn cho cơ sở dữ liệu từ Tcl TDBC được chia thành hai lớp Lớp trên, là những gì chúng tôi trình bày ở đây, là giao diện được các ứng dụng sử dụng để truy cập cơ sở dữ liệu Lớp dưới bao gồm các trình điều khiển khác nhau thực hiện quyền truy cập vào cơ sở dữ liệu cụ thể. Tại thời điểm viết bài, bản phân phối TDBC bao gồm các trình điều khiển cho MySQL, PostgreSQL, Sqlite3 và bất kỳ cơ sở dữ liệu nào có thể truy cập thông qua giao diện ODBC. Tài liệu TDBC cũng định nghĩa một giao diện cho phép viết trình điều khiển mới cho các triển khai cơ sở dữ liệu khác
1. 1. Cài đặt TDBCPhần mở rộng TDBC được bao gồm trong Tcl 8 tiêu chuẩn. 6 phân phối nguồn cũng như phân phối nhị phân từ ActiveState 1. 2. Đang tải TDBCTDBC được tải bằng lệnh Tcl package require tdbc::odbc 4 tiêu chuẩn. Gói cụ thể sẽ được tải tùy thuộc vào trình điều khiển cơ sở dữ liệu nào được mong muốn. Các gói bao gồm trong phân phối cốt lõi được hiển thị trongBảng 1. Gói trình điều khiển TDBC lõiGóiCơ sở dữ liệutdbc. sqlite3 Sqlite3 tdbc. postgres PostgreSQL tdbc. mysql mysql tdbc. odbc Bất kỳ cơ sở dữ liệu nào cung cấp giao diện ODBC Đương nhiên, khi xử lý nhiều triển khai cơ sở dữ liệu trong một ứng dụng, nhiều hơn một trong các gói này có thể được tải nếu muốn Đối với các ví dụ mã của chúng tôi, chúng tôi sẽ sử dụng cơ sở dữ liệu Sqlite3 và do đó tải gói tương ứng % package require tdbc::sqlite3
→ 1.0.4
2. Các khái niệmTDBC tuân theo mô hình chung giống như các API truy cập cơ sở dữ liệu khác và bao gồm các bước gần như sau Đầu tiên, một kết nối [] phải được thiết lập với cơ sở dữ liệu (và nhà cung cấp cơ sở dữ liệu) quan tâm. Ngoài việc xác định cơ sở dữ liệu, điều này cũng có thể bao gồm thông tin đăng nhập ủy quyền và các tùy chọn khác. Tất cả các tương tác tiếp theo cho cơ sở dữ liệu được thực hiện thông qua đối tượng kết nối này và các đối tượng thay thế của nó Tiếp theo, một câu lệnh SQL được chuẩn bị bằng cách sử dụng đối tượng kết nối và sau đó được thực thi với kết quả được trả về dưới dạng tập kết quả Tập kết quả được lặp lại để hoạt động trên dữ liệu được trả về Tập lệnh và tập kết quả được giải phóng để không sử dụng hết tài nguyên Các bước 2-4 được lặp lại khi cần thiết Khi hoàn tất, kết nối cơ sở dữ liệu bị đóng
TDBC đóng gói tất cả các khái niệm trừu tượng ở trên dưới dạng các lớp package require tdbc::odbc 5, package require tdbc::odbc 6 và package require tdbc::odbc 73. Kết nối với cơ sở dữ liệuMột kết nối cơ sở dữ liệu được đại diện bởi một đối tượng của lớp package require tdbc::odbc 8 thích hợp. Để kết nối với cơ sở dữ liệu, bạn tạo một đối tượng của lớp này chỉ định cơ sở dữ liệu quan tâm. Cách xác định cơ sở dữ liệu phụ thuộc vào trình điều khiển cơ sở dữ liệu đang sử dụng3. 1. Sqlite3Gói package require tdbc::odbc 9 phải được tải để truy cập cơ sở dữ liệu Sqlite3package require tdbc::sqlite3
Để mở cơ sở dữ liệu Sqlite3, đường dẫn đến tệp cơ sở dữ liệu sqlite3 được chuyển. Ví dụ: để mở cơ sở dữ liệu Sqlite3 trong thư mục hiện tại, ________số 8 Điều này sẽ tạo đối tượng tdbc::odbc::connection create db "Driver={SQL Server};Server=localhost;Trusted_Connection=Yes;Database=YourDatabaseName;" 0 đại diện cho kết nối cơ sở dữ liệu với cơ sở dữ liệu tdbc::odbc::connection create db "Driver={SQL Server};Server=localhost;Trusted_Connection=Yes;Database=YourDatabaseName;" 1. Như chúng ta thấy trong giây lát, chúng ta có thể thao tác trên cơ sở dữ liệu bằng cách gọi các phương thức trên đối tượng nàyĐối với mã mẫu của chúng tôi, chúng tôi sẽ tạo và sử dụng cơ sở dữ liệu Sqlite3 trong bộ nhớ. Mã thông báo đặc biệt tdbc::odbc::connection create db "Driver={SQL Server};Server=localhost;Trusted_Connection=Yes;Database=YourDatabaseName;" 2 dẫn đến cơ sở dữ liệu được tạo hoàn toàn trong bộ nhớ mà không có ổ đĩa. Nó sẽ bị xóa sau khi đóng đủ cho mục đích mã mẫu% package require tdbc::sqlite3
→ 1.0.4 2Lưu ý ở đây chúng tôi sử dụng phương thức TclOO tdbc::odbc::connection create db "Driver={SQL Server};Server=localhost;Trusted_Connection=Yes;Database=YourDatabaseName;" 3 trái ngược với tdbc::odbc::connection create db "Driver={SQL Server};Server=localhost;Trusted_Connection=Yes;Database=YourDatabaseName;" 4 để tạo tên đối tượng kết nối cho chúng tôi3. 2. ODBCKết nối cơ sở dữ liệu mở (ODBC) là một API tiêu chuẩn công nghiệp để truy cập cơ sở dữ liệu. Việc triển khai cơ sở dữ liệu hỗ trợ giao diện này có thể được truy cập thông qua gói tdbc::odbc::connection create db "Driver={SQL Server};Server=localhost;Trusted_Connection=Yes;Database=YourDatabaseName;" 5package require tdbc::odbc Windows đi kèm với hỗ trợ ODBC tích hợp nhưng để sử dụng ODBC trên Unix hoặc Linux, bạn có thể cần cài đặt gói ODBC như unixODBC hoặc iODBCĐể kết nối với cơ sở dữ liệu ODBC, chuỗi kết nối phải được chỉ định. Điều này có dạng một loạt các cặp giá trị và tên thuộc tính chỉ định các đặc điểm kết nối. Ví dụ: (giả sử chúng tôi đang sử dụng Windows) tdbc::odbc::connection create db "Driver={SQL Server};Server=localhost;Trusted_Connection=Yes;Database=YourDatabaseName;"
sẽ trả về một đối tượng kết nối cho cơ sở dữ liệu SQL Server tdbc::odbc::connection create db "Driver={SQL Server};Server=localhost;Trusted_Connection=Yes;Database=YourDatabaseName;" 6 trên hệ thống cục bộ. Lưu ý các thuộc tính bổ sung có thể được chỉ định trong chuỗi kết nối. Chẳng hạn, thuộc tính và giá trị tdbc::odbc::connection create db "Driver={SQL Server};Server=localhost;Trusted_Connection=Yes;Database=YourDatabaseName;" 7 chỉ định rằng thông tin đăng nhập của tài khoản Windows mà ứng dụng đang chạy sẽ được sử dụng để cấp quyềnTùy thuộc vào hệ thống và cơ sở dữ liệu, bạn có thể xác định tên nguồn dữ liệu (DSN) lưu trữ dữ liệu được sử dụng để tạo chuỗi kết nối. Sau đó, bạn chỉ cần chỉ định DSN để kết nối với cơ sở dữ liệu. Vì vậy, cuộc gọi trên sau đó sẽ trở thành package require tdbc::odbc 0Bạn có thể sử dụng trong TDBC để xác định DSN nếu triển khai ODBC cơ bản hỗ trợ API trình cài đặt ODBC. Ngoài ra, trên các hệ thống Windows, bạn có thể sử dụng ứng dụng ODBC trong Bảng điều khiển để xác định và định cấu hình DSN. Trên Unix/Linux, unixODBC và iODBC đều cung cấp GUI và phương tiện dòng lệnh để xác định DSN Chuỗi kết nối là trình điều khiển ODBC cụ thể và đôi khi khó hiểu đúng. Trang web là một nguồn tài nguyên hữu ích để hiểu và xây dựng nhữngNgoài các trình điều khiển TDBC được hỗ trợ, một số môi trường ODBC hỗ trợ tùy chọn tdbc::odbc::connection create db "Driver={SQL Server};Server=localhost;Trusted_Connection=Yes;Database=YourDatabaseName;" 8 dẫn đến lời nhắc về thông tin xác thực của người dùng nếu được yêu cầu. xem tdbc. tài liệu tham khảo odbc để biết chi tiết về việc sử dụng nóNhư đã mô tả, gói này cũng thực hiện một số lệnh tiện ích để tương tác với trình quản lý ODBC của hệ thống 3. 3. mysqlKết nối với MySQL yêu cầu gói tdbc::odbc::connection create db "Driver={SQL Server};Server=localhost;Trusted_Connection=Yes;Database=YourDatabaseName;" 9package require tdbc::odbc 3Gói khác với Sqlite3 và ODBC ở chỗ kết nối được chỉ định thông qua một tập hợp các tùy chọn thay vì được chuyển dưới dạng tên tệp hoặc đối số chuỗi kết nối. Các tùy chọn này được hiển thị trong ban 2. Tùy chọn kết nối MySQL và PostgreSQLTùy chọnMô tảpackage require tdbc::odbc 00Tên của hệ thống mà máy chủ cơ sở dữ liệu đang chạy. Mặc định cho hệ thống cục bộ package require tdbc::odbc 01Số cổng TCP/IP mà máy chủ đang lắng nghe kết nối package require tdbc::odbc 02Tên của tên người dùng được sử dụng để truy cập cơ sở dữ liệu. Mặc định cho id người dùng hiện tại của quy trình package require tdbc::odbc 03Mật khẩu được trình bày cho máy chủ. Theo mặc định, không có mật khẩu nào được hiển thị package require tdbc::odbc 04Tên của cơ sở dữ liệu được đặt mặc định nếu không có cơ sở dữ liệu nào được chỉ định trong một truy vấn. Mặc định cho cơ sở dữ liệu mặc định cho người dùng được chỉ định bởi tùy chọn package require tdbc::odbc 05Trình điều khiển MySQL hỗ trợ các tùy chọn bổ sung dành riêng cho trình điều khiển mà chúng tôi không mô tả ở đây. xem tdbc. trang tham khảo mysql để biết chi tiết 3. 4. PostgreSQLKết nối với cơ sở dữ liệu PostgreSQL ít nhiều giống với những gì đã được mô tả trước đây cho MySQL. Gói package require tdbc::odbc 06 đã được tảipackage require tdbc::odbc 1và kết nối được thực hiện bằng cách sử dụng các tùy chọn hiển thị trong Trình điều khiển PostgreSQL cũng hỗ trợ các tùy chọn bổ sung dành riêng cho trình điều khiển. xem tdbc. trang tham khảo postgres 3. 5. tùy chọn kết nốiTất cả các trình điều khiển TDBC đều hiểu bộ tùy chọn chung được hiển thị trong bàn số 3. Tùy chọn kết nối chung cho tất cả các trình điều khiển TDBC Tùy chọnMô tảpackage require tdbc::odbc 07Tên của mã hóa ký tự sẽ được sử dụng trên kết nối. TÊN phải là một trong những tên được trả về bởi lệnh Tcl package require tdbc::odbc 08. Nói chung, không cần thiết phải chỉ định điều này nhưng hãy lưu ý rằng các trình điều khiển khác nhau trong cách xử lý tùy chọn nàypackage require tdbc::odbc 09Chỉ định mức cô lập giao dịch cần thiết cho các giao dịch trên cơ sở dữ liệu. ISOLATION phải là một trong số package require tdbc::odbc 30, package require tdbc::odbc 31, package require tdbc::odbc 32 hoặc package require tdbc::odbc 33. xem tdbc. tham khảo kết nối để biết chi tiếtpackage require tdbc::odbc 34Chỉ định khoảng thời gian sau đó một thao tác sẽ hết thời gian chờ với một lỗi. Giá trị mặc định của package require tdbc::odbc 35 cho biết không có thời gian chờ. Các hoạt động áp dụng thời gian chờ khác nhau giữa các trình điều khiển và cơ sở dữ liệu khác nhau. Tham khảo các trang tham khảo thích hợp cho từng trình điều khiểnpackage require tdbc::odbc 36Nếu được chỉ định là package require tdbc::odbc 37 hoặc package require tdbc::odbc 38, kết nối sẽ không sửa đổi cơ sở dữ liệu3. 6. Định cấu hình kết nốiCác giá trị của các tùy chọn có thể được chỉ định tại thời điểm đối tượng package require tdbc::odbc 5 được tạo có thể được truy xuất thông qua phương thức package require tdbc::odbc 10 của đối tượng kết nối. Phương pháp tương tự cũng có thể được sử dụng để sửa đổi các giá trị của một số tùy chọnVì vậy, để truy xuất cấu hình của cơ sở dữ liệu mẫu trong bộ nhớ của chúng tôi package require tdbc::odbc 6Chúng tôi cũng có thể chuyển một hoặc nhiều tùy chọn cấu hình để sửa đổi package require tdbc::sqlite3 03. 7. Giải phóng tài nguyênKhi không còn cần thiết, các kết nối cơ sở dữ liệu phải được đóng lại bằng cách gọi phương thức package require tdbc::odbc 11 trên đối tượng package require tdbc::odbc 12package require tdbc::sqlite3 1Thao tác này cũng sẽ đóng và giải phóng các tài nguyên liên quan đến đối tượng package require tdbc::odbc 6 và package require tdbc::odbc 7 được tạo thông qua kết nối4. Hoạt động cơ bản4. 1. Thực thi SQLViệc thực thi một câu lệnh SQL trước tiên bao gồm việc truy xuất một đối tượng package require tdbc::odbc 6 thông qua phương thức package require tdbc::odbc 16 của một package require tdbc::odbc 5. Do đó, để thêm một bảng vào cơ sở dữ liệu mẫu trong bộ nhớ mà chúng tôi đã kết nối trước đó,package require tdbc::sqlite3 2Phương thức package require tdbc::odbc 18 của đối tượng package require tdbc::odbc 6 sau đó được gọi để chạy câu lệnh SQLpackage require tdbc::sqlite3 3Phương thức package require tdbc::odbc 18 trả về một đối tượng package require tdbc::odbc 7 mà chúng ta sẽ kiểm tra sau. Hiện tại, chúng tôi giải phóng cả hai đối tượng bằng cách gọi phương thức package require tdbc::odbc 11 của chúng. Giống như các đối tượng package require tdbc::odbc 5, các đối tượng package require tdbc::odbc 6 và package require tdbc::odbc 7 cũng nên được giải phóng khi không còn cần thiếtpackage require tdbc::sqlite3 4Lưu ý rằng việc đóng package require tdbc::odbc 66 cũng đóng bất kỳ đối tượng package require tdbc::odbc 67 nào được chứa, vì vậy chúng tôi không cần phải đóng package require tdbc::odbc 68 một cách rõ ràng tại đây. Tương tự, các đối tượng package require tdbc::odbc 6 không được đóng một cách rõ ràng sẽ bị đóng khi đối tượng sở hữu package require tdbc::odbc 5 bị đóng. Tuy nhiên, để tiết kiệm tài nguyên, nói chung nên giải phóng chúng một cách rõ ràng khi không còn cần thiết. Vì chúng tôi có nhiều việc muốn làm với kết nối và không đóng nó, nên chúng tôi đóng package require tdbc::odbc 66 một cách rõ ràngChèn và truy vấn theo một mẫu tương tự package require tdbc::sqlite3 5Cũng sẽ đóng tập kết quả được trả về bởi package require tdbc::odbc 18Chuỗi nhiều bước chuẩn bị và thực hiện này có thể hơi tẻ nhạt và TDBC cung cấp một số phương thức hoạt động như trình bao bọc và làm cho nó thuận tiện hơn. Chúng ta sẽ thảo luận về những điều này và những ưu và nhược điểm của chúng một chút sau 4. 2. Truyền giá trị cho SQLVí dụ trên mã hóa cứng các giá trị được chèn vào bảng. Đương nhiên, đó không phải là một lựa chọn khả thi khi các giá trị không được biết trước tại thời điểm viết chương trình. TDBC cho phép các giá trị biến Tcl được chuyển vào câu lệnh SQL bằng cách thay thế tất cả các tên trong SQL bắt đầu bằng package require tdbc::sqlite3 03 bằng các giá trị ''tương ứng'' của chúng. Các giá trị này có thể đến từ các biến Tcl cùng tên hoặc từ một từ điển được truyền vào. Cả hai đều được minh họa dưới đâypackage require tdbc::sqlite3 6Ở đây, các giá trị được chèn vào được chọn từ các biến Tcl Ngoài ra, chúng ta có thể chuyển từ điển sang lệnh package require tdbc::odbc 18. Các giá trị sẽ được lấy từ các khóa cùng tên trong từ điểnpackage require tdbc::sqlite3 7Thứ tự của các yếu tố không quan trọngLưu ý từ trình tự trên rằng một câu lệnh đã chuẩn bị có thể được thực hiện nhiều lần với các giá trị khác nhau 4. 3. Lấy dữ liệuTruy vấn dữ liệu từ cơ sở dữ liệu tuân theo cùng một mẫu chính xác nhưng bây giờ chúng tôi cũng phải trích xuất dữ liệu từ đối tượng package require tdbc::odbc 7 được trả về bởi bất kỳ lệnh gọi package require tdbc::odbc 18 nàopackage require tdbc::sqlite3 8Bây giờ chúng ta có một đối tượng package require tdbc::odbc 7 đang giữ kết quả của truy vấnMỗi hàng trong tập kết quả có thể được trả về bằng các phương thức package require tdbc::sqlite3 08 và package require tdbc::sqlite3 09. Trong cả hai trường hợp, mỗi cuộc gọi trả về hàng tiếp theo từ tập hợp kết quả. Hàng được lưu trữ trong một biến có tên được truyền cho phương thức và chính phương thức đó trả về package require tdbc::odbc 38 khi một hàng được trả về thành công và package require tdbc::odbc 35 nếu không có thêm dữ liệu nào được trả vềSự khác biệt giữa hai loại này là package require tdbc::sqlite3 08 trả về hàng dưới dạng danh sách theo thứ tự như được trả về bởi phương thức package require tdbc::sqlite3 13 trong khi package require tdbc::sqlite3 09 trả về hàng dưới dạng package require tdbc::sqlite3 15 với các tên cột là khóapackage require tdbc::sqlite3 94. 4. phương pháp tiện lợiNhư chúng ta đã thấy ở trên, các hoạt động của cơ sở dữ liệu liên quan đến việc gọi các phương thức package require tdbc::odbc 16 và package require tdbc::odbc 18 và sau đó giải phóng các đối tượng package require tdbc::odbc 6 và package require tdbc::odbc 7. Để đảm bảo dọn dẹp đúng cách, trình tự phải được bao bọc trong các khối package require tdbc::sqlite3 20 hoặc package require tdbc::sqlite3 21. Vì vậy, trong mã giả, mã trông giống như thế nàytdbc::sqlite3::connection create db my-database.sqlite3 0TDBC cung cấp một số phương pháp tiện lợi đảm nhiệm tất cả các bản tóm tắt ở trên 4. 4. 1. Phương pháp % package require tdbc::sqlite3
→ 1.0.4 28Phương thức % package require tdbc::sqlite3
→ 1.0.4 28 đóng gói mã giả ở trên trong đó quá trình xử lý vòng lặp bao gồm việc thu thập tất cả các kết quả được trả về bởi package require tdbc::sqlite3 09 hoặc package require tdbc::sqlite3 08 vào một danh sách duy nhấtPhương thức được hỗ trợ bởi cả ba loại đối tượng Trong trường hợp của package require tdbc::odbc 7, % package require tdbc::sqlite3
→ 1.0.4 28 chỉ cần lặp lại trên tập kết quả thu thập đầu ra của các phương thức package require tdbc::sqlite3 08 hoặc package require tdbc::sqlite3 09Trong trường hợp của package require tdbc::odbc 6, phương thức thực thi câu lệnh và sau đó thu thập các hàng từ tập kết quả trả về như được mô tả trong trường hợp trướcTrong trường hợp của package require tdbc::odbc 5, phương thức chuẩn bị SQL được truyền dưới dạng tham số, sau đó thực thi câu lệnh được trả về như được mô tả trong trường hợp trước
Trong mọi trường hợp, phương pháp % package require tdbc::sqlite3
→ 1.0.4 28 sẽ giải phóng các đối tượng và tài nguyên một cách thích hợp ngay cả trong trường hợp có lỗiDưới đây chúng tôi minh họa một truy vấn đơn giản sử dụng các phương pháp khác nhau, đầu tiên không sử dụng % package require tdbc::sqlite3
→ 1.0.4 28tdbc::sqlite3::connection create db my-database.sqlite3 1Bây giờ cùng mã nhưng sử dụng phương thức % package require tdbc::sqlite3
→ 1.0.4 28 của đối tượng package require tdbc::odbc 7. Lưu ý rằng điều này trả về các hàng dưới dạng từ điển theo mặc địnhtdbc::sqlite3::connection create db my-database.sqlite3 2Thay thế vòng lặp bên trong ví dụ trướcỞ trên, chúng tôi chỉ lưu viết vòng lặp trong cùng trong code. Chúng ta có thể tiến thêm một bước nữa và sử dụng phương thức % package require tdbc::sqlite3
→ 1.0.4 28 của đối tượng package require tdbc::odbc 6. Lưu ý sự khác biệt so với phương thức % package require tdbc::sqlite3
→ 1.0.4 28 của package require tdbc::odbc 7 ở chỗ ở đây chúng ta cần chuyển các giá trị được sử dụng để truy vấn sang phương thức % package require tdbc::sqlite3
→ 1.0.4 28tdbc::sqlite3::connection create db my-database.sqlite3 3Chúng tôi không phải giải quyết rõ ràng với các tập kết quảCuối cùng, chúng tôi thực hiện toàn bộ và gọi % package require tdbc::sqlite3
→ 1.0.4 28 trên chính kết nối cơ sở dữ liệu. Rõ ràng, trong trường hợp này, chúng ta phải cho nó biết SQL mà chúng ta muốn chạy ngoài việc chuyển vào các giá trị truy vấntdbc::sqlite3::connection create db my-database.sqlite3 4Chúng tôi không phải đối phó với các tuyên bốVới hình minh họa cuối cùng này ngắn hơn nhiều so với các ví dụ trước, tại sao người ta lại chọn bất kỳ hình nào trong số những hình khác? Với cơ sở dữ liệu và tập hợp kết quả rất lớn, % package require tdbc::sqlite3
→ 1.0.4 28 có thể không hoạt động được do không thể thu thập tất cả các hàng trong bộ nhớ trước khi xử lýXử lý rõ ràng các tập kết quả cho phép kiểm soát chi tiết quá trình lặp lại, ví dụ: chấm dứt quá trình lặp lại dựa trên một số quy tắc phức tạp nằm ngoài khả năng của SQL
Định dạng của mỗi hàng được trả về có thể được kiểm soát bởi tùy chọn package require tdbc::sqlite3 43 có thể lấy các giá trị package require tdbc::sqlite3 44 hoặc package require tdbc::sqlite3 45 (mặc định). Một tùy chọn bổ sung package require tdbc::sqlite3 46 cho phép truy xuất tên của các cột được trả vềtdbc::sqlite3::connection create db my-database.sqlite3 54. 4. 2. Phương pháp % package require tdbc::sqlite3
→ 1.0.4 29Phương thức % package require tdbc::sqlite3
→ 1.0.4 29 có mục đích rất giống với % package require tdbc::sqlite3
→ 1.0.4 28 ngoại trừ việc thay vì chỉ thu thập kết quả vào một danh sách, nó thực thi một tập lệnh đã cho cho mọi hàng trong tập kết quả. Vì nó giống với % package require tdbc::sqlite3
→ 1.0.4 28 nên chúng tôi không bàn chi tiết mà chỉ minh họa nó như được gọi trên một đối tượng package require tdbc::odbc 5. Lưu ý rằng package require tdbc::odbc 6 và package require tdbc::odbc 7 cũng triển khai phương thức ở dạng được sửa đổi phù hợptdbc::sqlite3::connection create db my-database.sqlite3 6Giống như % package require tdbc::sqlite3
→ 1.0.4 28, % package require tdbc::sqlite3
→ 1.0.4 29 cũng đảm nhiệm tất cả các công việc kế toán trung gian5. Chủ đề khác5. 1. giao dịchCó một số cách ứng dụng có thể sử dụng các giao dịch. Chúng tôi mô tả cả hai dưới đây 5. 1. 1. Sử dụng phương pháp package require tdbc::odbc 0Đầu tiên là sử dụng phương pháp package require tdbc::odbc 0 của package require tdbc::odbc 5. Điều này bắt đầu một giao dịch trên kết nối và đánh giá tập lệnh đã thông qua. Nếu tập lệnh kết thúc ''bình thường'' - với package require tdbc::sqlite3 59, package require tdbc::sqlite3 60 hoặc package require tdbc::sqlite3 61 - giao dịch được thực hiện. Đối với các mã trả lại khác, bao gồm cả lỗi, giao dịch được khôi phục và lỗi được tính lạiViệc sử dụng phương pháp được minh họa bằng ví dụ đơn giản bên dưới để chuyển tiền từ tài khoản này sang tài khoản khác tdbc::sqlite3::connection create db my-database.sqlite3 7Trừ số dư của TomXác minh số dư được cập nhật trong giao dịchThêm vào số dư của DickXác minh số dư của Tom đã được khôi phục thànhLưu ý rằng số dư của Tom được khôi phục khi giao dịch bị hủy bỏ do ngoại lệ lỗi 5. 1. 2. Sử dụng package require tdbc::odbc 1, package require tdbc::odbc 2 và package require tdbc::odbc 3Trong trường hợp chuỗi các hoạt động trong một giao dịch không thể được gói gọn trong một tập lệnh có thể được truyền cho phương thức package require tdbc::odbc 0, một ứng dụng có thể tự quản lý giao dịch một cách rõ ràng bằng cách gọi phương thức package require tdbc::odbc 1 của đối tượng package require tdbc::odbc 5. Sau đó, tại một số thời điểm sau đó, nó có thể gọi các phương thức package require tdbc::odbc 2 hoặc package require tdbc::odbc 3 để hoàn thành hoặc hủy bỏ giao dịchViết lại ví dụ trước, tdbc::sqlite3::connection create db my-database.sqlite3 8Bắt đầu giao dịchKhi có lỗi, hãy hủy giao dịchKhi thành công, hãy thực hiện giao dịch5. 2. Xử lý giá trị NULLLưu ý rằng chuỗi rỗng package require tdbc::sqlite3 70 không giống với giá trị SQL package require tdbc::sqlite3 71, không có cách nào để biểu diễn package require tdbc::sqlite3 71 trong Tcl khi mọi thứ đều là chuỗi. Trong một số ứng dụng, sự khác biệt không quan trọng và chuỗi rỗng có thể được sử dụng thay thế cho nhau với package require tdbc::sqlite3 71. Trong trường hợp sự khác biệt là quan trọng, nên sử dụng giao diện dựa trên từ điển cho các phương pháp TDBC như được minh họa tại đâyViết giá trị NULL Để viết package require tdbc::sqlite3 71 vào một cột trong bảng, hãy chuyển đến phương thức thích hợp một từ điển chứa các giá trị biến bị ràng buộc cho các cột. Một package require tdbc::sqlite3 71 sẽ được lưu trữ trong bất kỳ cột nào mà khóa tương ứng không có trong từ điểntdbc::sqlite3::connection create db my-database.sqlite3 9Tương tự, để truy xuất dữ liệu chứa package require tdbc::sqlite3 71, hãy sử dụng một trong các biểu mẫu trả về các hàng dưới dạng từ điển. Nếu một giá trị là package require tdbc::sqlite3 71, từ điển được trả về cho hàng sẽ không chứa khóa tương ứng% package require tdbc::sqlite3
→ 1.0.4 20Lưu ý rằng các khóa package require tdbc::sqlite3 78 và package require tdbc::sqlite3 79 bị thiếuBạn cũng có thể sử dụng phương pháp package require tdbc::sqlite3 80 cho mục đích tương tựLưu ý kết quả khi định dạng danh sách được sử dụng % package require tdbc::sqlite3
→ 1.0.4 21Trong trường hợp này, không có cách nào để phân biệt liệu giá trị được lưu trữ trong cơ sở dữ liệu thực sự là package require tdbc::sqlite3 70 hay package require tdbc::sqlite3 715. 3. thủ tục lưu trữCác thủ tục được lưu trữ có thể được gọi bằng phương thức package require tdbc::sqlite3 83 của đối tượng package require tdbc::odbc 5. Giống như phương thức package require tdbc::odbc 16, điều này cũng trả về một đối tượng package require tdbc::odbc 6 mà sau đó có thể được sử dụng như đã mô tả trước đó5. 4. nội tâmTất cả các lớp TDBC đều cho phép xem xét nội tâm và kiểm tra siêu thông tin liên quan đến cơ sở dữ liệu. Chúng tôi chỉ mô tả một vài trong số này. Xem danh sách đầy đủ và chi tiết TDBC theo dõi các đối tượng vẫn đang mở trong kết nối cơ sở dữ liệu % package require tdbc::sqlite3
→ 1.0.4 22Rõ ràng là chúng tôi đã quên phát hành một số đối tượng. Điều này thực sự hữu ích cho lần dọn dẹp cuối cùng, chẳng hạn như trên cơ sở mỗi yêu cầu đối với máy chủ web để mở kết nối cơ sở dữ liệu Chúng tôi có thể truy xuất thông tin lược đồ từ cơ sở dữ liệu… % package require tdbc::sqlite3
→ 1.0.4 23…hoặc về các cột trong cơ sở dữ liệu… % package require tdbc::sqlite3
→ 1.0.4 24…hoặc về một cột cụ thể % package require tdbc::sqlite3
→ 1.0.4 25Xem ý nghĩa của các từ điển được trả về 5. 5. tiện ích ODBCGói tdbc::odbc::connection create db "Driver={SQL Server};Server=localhost;Trusted_Connection=Yes;Database=YourDatabaseName;" 5 cung cấp một số lệnh tiện ích liên quan đến tương tác với trình quản lý ODBC. Một số trong số này phụ thuộc vào sự hỗ trợ của trình quản lý ODBC của hệ thống đối với API Trình cài đặt ODBCLệnh package require tdbc::sqlite3 88 liệt kê các trình điều khiển ODBC đã cài đặt trên hệ thống% package require tdbc::sqlite3
→ 1.0.4 26Lệnh package require tdbc::sqlite3 89 liệt kê các nguồn dữ liệu ODBC được định cấu hình trên hệ thống% package require tdbc::sqlite3
→ 1.0.4 27Cuối cùng, bạn có thể tạo nguồn dữ liệu ODBC mới bằng lệnh package require tdbc::sqlite3 90. Có những ví dụ về điều này6. Người giới thiệuTIPTDBC Kết nối cơ sở dữ liệu Tcl (TDBC), Kevin B. Kenny và cộng sự, Đề xuất cải tiến Tcl #350, http. //www. tcl. tk/cgi-bin/tct/tip/350 KBKPAPERKết nối cơ sở dữ liệu Tcl, Kevin B. Kenny, Kỷ yếu Hội nghị Tcl, 2008. Bài viết gốc mô tả TDBC. Có sẵn từ http. //www. tclcommunityassociation. org/wub/proceedings/Proceedings-2008/proceedings/tdbc/tcl2k8-kenny-withfonts. pdf TDBCREFCác trang tham khảo TDBC, http. //www. tcl. tk/man/tcl8. 6/TdbcCmd/nội dung. htm WWWCONNSTRTham chiếu chuỗi kết nối, https. //www. dây kết nối. com/
Một số mã sẽ nhất thiết phải dành riêng cho cơ sở dữ liệu do các khả năng và yêu cầu khác nhau trong việc triển khai cơ sở dữ liệu
Ruby có phải là trình kết nối MySQL hợp lệ không?
Trình kết nối đề cập đến một phần mềm cho phép ứng dụng của bạn kết nối với máy chủ cơ sở dữ liệu MySQL. MySQL cung cấp trình kết nối cho nhiều ngôn ngữ, bao gồm Python, Perl, Ruby, PHP, Java (JDBC), C, v.v.
Làm cách nào để sử dụng các lệnh TCL trong MySQL?
Giao dịch là một tập hợp các câu lệnh SQL được thực thi trên dữ liệu được lưu trữ trong DBMS. Bất cứ khi nào bất kỳ giao dịch nào được thực hiện, các giao dịch này tạm thời xảy ra trong cơ sở dữ liệu. Vì vậy, để thực hiện các thay đổi vĩnh viễn, chúng tôi sử dụng các lệnh TCL. . LÀM. Lệnh này dùng để lưu dữ liệu vĩnh viễn. . QUAY LẠI. . TIẾT KIỆM
Các lệnh TCL trong DBMS là gì?
Hình thức đầy đủ của TCL là Ngôn ngữ kiểm soát giao dịch. Các lệnh TCL về cơ bản là được sử dụng để quản lý và kiểm soát các giao dịch trong cơ sở dữ liệu nhằm duy trì tính nhất quán . Và nó cũng giúp người dùng quản lý tất cả các thay đổi được thực hiện bởi các lệnh DML để duy trì các giao dịch của mình.
MySQL có giao diện không?
MySQL Shell là một giao diện tương tác với MySQL hỗ trợ các chế độ JavaScript, Python hoặc SQL . Bạn có thể sử dụng MySQL Shell để tạo nguyên mẫu ứng dụng, thực hiện truy vấn và cập nhật dữ liệu. Cài đặt MySQL Shell đã có hướng dẫn tải và cài đặt MySQL Shell. |