Mysql_real_connect

Nếu bạn muốn viết các ứng dụng di động trên cơ sở dữ liệu, hãy sử dụng MySQLdb và tránh sử dụng trực tiếp mô-đun này. _mysql cung cấp một giao diện chủ yếu triển khai API MySQL C. Để biết thêm thông tin, hãy xem tài liệu về MySQL. Tài liệu cho mô-đun này hơi yếu vì có lẽ bạn nên sử dụng mô-đun MySQLdb cấp cao hơn. Nếu bạn thực sự cần nó, hãy sử dụng các tài liệu MySQL tiêu chuẩn và chuyển ngữ khi cần thiết

API MySQL C đã được bao bọc theo cách hướng đối tượng. Các cấu trúc dữ liệu MySQL duy nhất được triển khai là các loại MYSQL (xử lý kết nối cơ sở dữ liệu) và MYSQL_RES (xử lý kết quả). Nói chung, bất kỳ hàm nào lấy MYSQL *mysql làm đối số giờ đây là một phương thức của đối tượng kết nối và bất kỳ hàm nào lấy MYSQL_RES *result làm đối số là một phương thức của đối tượng kết quả. Các chức năng không yêu cầu cấu trúc dữ liệu MySQL nào được triển khai dưới dạng các chức năng trong mô-đun. Các chức năng yêu cầu một trong các cấu trúc dữ liệu MySQL khác thường không được triển khai. Các chức năng không dùng nữa không được triển khai. Trong mọi trường hợp, tiền tố mysql_ bị loại bỏ khỏi tên. Hầu hết các phương thức kết nối được liệt kê cũng có sẵn dưới dạng các phương thức đối tượng Kết nối MySQLdb. Việc sử dụng chúng là không di động

C API_mysqlmysql_affected_rows()conn. bị ảnh hưởng () mysql_autocommit () liên kết. autocommit()mysql_character_set_name()conn. character_set_name()mysql_close()conn. close() mysql_commit() kết nối. cam kết() mysql_connect()_mysql. kết nối() mysql_data_seek() kết quả. data_seek()mysql_debug()_mysql. gỡ lỗi () mysql_dump_debug_infoconn. dump_debug_info()mysql_escape_string()_mysql. escape_string() mysql_fetch_row() kết quả. fetch_row()mysql_get_character_set_info()conn. get_character_set_info()mysql_get_client_info()_mysql. get_client_info()mysql_get_host_info()conn. get_host_info()mysql_get_proto_info()conn. get_proto_info()mysql_get_server_info()conn. get_server_info()mysql_info()conn. thông tin () mysql_insert_id () liên kết. kết quả insert_id()mysql_num_fields(). num_fields()mysql_num_rows()kết quả. num_rows()mysql_options() các tùy chọn khác nhau cho _mysql. kết nối() mysql_ping() kết nối. ping() mysql_query() kết nối. truy vấn() mysql_real_connect()_mysql. kết nối() mysql_real_query() kết nối. truy vấn() mysql_real_escape_string() kết nối. escape_string()mysql_rollback()conn. rollback() mysql_row_seek() kết quả. kết quả row_seek()mysql_row_tell(). row_tell()mysql_select_db()conn. select_db()mysql_set_character_set()conn. tùy chọn set_character_set()mysql_ssl_set()ssl thành _mysql. kết nối() mysql_stat() kết nối. stat()mysql_store_result()conn. store_result()mysql_thread_id()conn. thread_id()mysql_thread_safe_client()conn. thread_safe_client()mysql_use_result()conn. use_result()mysql_warning_count()conn. cảnh báo_count() CLIENT_*MySQLdb. hằng số. KHÁCH HÀNG. *CR_*MySQLdb. hằng số. CR. *ER_*MySQLdb. hằng số. cấp cứu. *FIELD_TYPE_*MySQLdb. hằng số. LOẠI LĨNH VỰC. *FLAG_*MySQLdb. hằng số. LÁ CỜ. *

Được rồi, vì vậy bạn vẫn muốn sử dụng _mysql. Dưới đây là một số ví dụ

Kết nối cơ sở dữ liệu đơn giản nhất có thể là

import _mysql
db=_mysql.connect()

Điều này tạo kết nối đến máy chủ MySQL chạy trên máy cục bộ bằng ổ cắm UNIX tiêu chuẩn (hoặc ống có tên trên Windows), tên đăng nhập của bạn (từ biến môi trường NGƯỜI DÙNG), không có mật khẩu và không SỬ DỤNG cơ sở dữ liệu. Rất có thể bạn cần cung cấp thêm thông tin

db=_mysql.connect("localhost","joebob","moonpie","thangs")

Thao tác này tạo kết nối đến máy chủ MySQL chạy trên máy cục bộ thông qua ổ cắm UNIX (hoặc ống có tên), tên người dùng "joebob", mật khẩu "moonpie" và chọn cơ sở dữ liệu ban đầu "thangs"

Chúng tôi thậm chí còn chưa bắt đầu chạm vào tất cả các thông số mà connect() có thể thực hiện. Vì lý do này, tôi thích sử dụng tham số từ khóa

db=_mysql.connect(host="localhost",user="joebob",
                  passwd="moonpie",db="thangs")

Điều này thực hiện chính xác những gì ví dụ trước đã làm, nhưng dễ đọc hơn. Nhưng vì máy chủ mặc định là "localhost" và nếu tên đăng nhập của bạn thực sự là "joebob", bạn có thể rút ngắn nó thành thế này

db=_mysql.connect(passwd="moonpie",db="thangs")

Các ổ cắm UNIX và các đường dẫn có tên không hoạt động trên mạng, vì vậy nếu bạn chỉ định một máy chủ không phải localhost, TCP sẽ được sử dụng và bạn có thể chỉ định một cổng lẻ nếu cần (cổng mặc định là 3306)

db=_mysql.connect(host="outhouse",port=3307,passwd="moonpie",db="thangs")

Nếu thực sự phải làm như vậy, bạn có thể kết nối với máy chủ cục bộ bằng TCP bằng cách chỉ định tên máy chủ đầy đủ hoặc 127. 0. 0. 1

Nói chung, đặt mật khẩu vào mã của bạn không phải là một ý tưởng hay

db=_mysql.connect(host="outhouse",db="thangs",read_default_file="~/.my.cnf")

Điều này thực hiện những gì ví dụ trước thực hiện, nhưng lấy tên người dùng và mật khẩu cũng như các tham số khác từ ~/. của tôi. cnf (các hệ thống giống UNIX). Đọc về các tệp tùy chọn để biết thêm chi tiết

Vì vậy, bây giờ bạn có một kết nối mở dưới dạng db và muốn thực hiện một truy vấn. Chà, không có con trỏ trong MySQL và không có tham số thay thế, vì vậy bạn phải chuyển một chuỗi truy vấn hoàn chỉnh tới db. truy vấn()

db.query("""SELECT spam, eggs, sausage FROM breakfast
         WHERE price < 5""")

Không có giá trị trả lại từ điều này, nhưng có thể tăng ngoại lệ. Các ngoại lệ được xác định trong một mô-đun riêng, _mysql_Exceptions, nhưng _mysql xuất chúng. Đọc đặc tả API DB PEP-249 để tìm hiểu chúng là gì hoặc bạn có thể sử dụng MySQLError bắt tất cả

Lúc này truy vấn của bạn đã được thực hiện và bạn cần lấy kết quả. Bạn có hai lựa chọn

r=db.store_result()
# ...or...
r=db.use_result()

Cả hai phương thức đều trả về một đối tượng kết quả. Có gì khác biệt? . Nếu tập kết quả của bạn thực sự lớn, đây có thể là một vấn đề. Một cách giải quyết vấn đề này là thêm mệnh đề LIMIT vào truy vấn của bạn, để giới hạn số lượng hàng được trả về. Cách khác là sử dụng use_result(), giữ kết quả được đặt trong máy chủ và gửi từng hàng khi bạn tìm nạp. Tuy nhiên, điều này liên kết tài nguyên máy chủ và nó liên kết kết nối. Bạn không thể thực hiện thêm bất kỳ truy vấn nào cho đến khi bạn tìm nạp tất cả các hàng. Nói chung, tôi khuyên bạn nên sử dụng store_result() trừ khi tập hợp kết quả của bạn thực sự lớn và bạn không thể sử dụng LIMIT vì một số lý do

Bây giờ, để thực sự nhận được kết quả thực sự

________số 8

Điều này có thể trông hơi lạ. Điều đầu tiên bạn nên biết là, hàm fetch_row() nhận thêm một số tham số. Đầu tiên là, có bao nhiêu hàng (maxrows) sẽ được trả về. Theo mặc định, nó trả về một hàng. Nó có thể trả lại ít hàng hơn bạn yêu cầu, nhưng không bao giờ nhiều hơn. Nếu bạn đặt maxrows=0, nó sẽ trả về tất cả các hàng của tập hợp kết quả. Nếu bạn nhận được một bộ dữ liệu trống, bạn đã hết hàng

Tham số thứ hai (làm thế nào) cho nó biết hàng sẽ được biểu diễn như thế nào. Theo mặc định, nó bằng 0 có nghĩa là, trả về dưới dạng một bộ. how=1 có nghĩa là trả về dưới dạng từ điển, trong đó các khóa là tên cột hoặc bảng. cột nếu có hai cột có cùng tên (giả sử từ một phép nối). how=2 có nghĩa giống như how=1 ngoại trừ các phím luôn là bảng. cột;

OK, vậy tại sao chúng ta lại lấy 1-Tuple với một Tuple bên trong?

Điều kỳ lạ khác là. Giả sử đây là các cột số, tại sao chúng được trả về dưới dạng chuỗi? . Đây sẽ là một vấn đề thực sự khó chịu, nhưng trên thực tế, _mysql có thể làm điều này cho bạn. (Và MySQLdb làm điều này cho bạn. ) Để thực hiện chuyển đổi loại tự động, bạn cần tạo một từ điển chuyển đổi loại và chuyển từ này tới connect() làm tham số từ khóa conv

Các khóa của chuyển đổi phải là các loại cột MySQL, trong API C là FIELD_TYPE_*. Bạn có thể nhận được những giá trị như thế này

from MySQLdb.constants import FIELD_TYPE

Theo mặc định, bất kỳ loại cột nào không tìm thấy trong conv đều được trả về dưới dạng một chuỗi, phù hợp với nhiều nội dung. Đối với mục đích của chúng tôi, chúng tôi có thể muốn điều này

db=_mysql.connect("localhost","joebob","moonpie","thangs")
0

Điều này có nghĩa là, nếu đó là FIELD_TYPE_LONG, hãy gọi hàm int() dựng sẵn trên đó. Lưu ý rằng FIELD_TYPE_LONG là một cột INTEGER, tương ứng với một chữ C dài, cũng là loại được sử dụng cho một số nguyên Python thông thường. Nhưng hãy cẩn thận. Nếu nó thực sự là một cột UNSIGNED INTEGER, điều này có thể gây tràn. Vì lý do này, MySQLdb thực sự sử dụng long() để thực hiện chuyển đổi. Nhưng bây giờ chúng ta sẽ bỏ qua vấn đề tiềm ẩn này

Sau đó, nếu bạn sử dụng db=_mysql. kết nối(conv=my_conv. ), kết quả sẽ trả về ((3, 2, 0),), đó là những gì bạn mong đợi