Khi bạn muốn kết nối với cơ sở dữ liệu MySQL bằng mã Python, bạn có thể sử dụng cả mysql-connector-python Trình điều khiển MySQL và PyMySQL . mysql-connector-python Trình điều khiển MySQL là trình điều khiển tích hợp sẵn của máy chủ MySQL và PyMySQL là thư viện của bên thứ ba.
Tất cả hai thư viện python MySQL đều cung cấp các lớp để bạn có được kết nối cơ sở dữ liệu MySQL, thực hiện lệnh chèn, xóa, cập nhật, chọn SQL. Họ cũng hỗ trợ quản lý giao dịch. Bài viết này sẽ chỉ cho bạn một ví dụ về cách sử dụng mysql-connector-python và PyMySQL để hoạt động trên bảng cơ sở dữ liệu MySQL.
1. Cách sử dụng mysql-connector-python để vận hành cơ sở dữ liệu MySQL.
1.1 Cài đặt Thư viện mysql-connector-python.
- mysql-connector-python thư viện có thể được cài đặt khi bạn cài đặt cơ sở dữ liệu MySQL.
- Vì vậy, bạn có thể chạy lệnh
pip show mysql-connector-python
để kiểm tra xem nó đã được cài đặt hay chưa.$ pip show mysql-connector-python WARNING: Package(s) not found: mysql-connector-python
- Nếu mysql-connector-python thư viện chưa được cài đặt, bạn có thể chạy lệnh
pip install mysql-connector-python
để cài đặt nó.$ pip install mysql-connector-python Collecting mysql-connector-python Downloading mysql_connector_python-8.0.25-py2.py3-none-any.whl (319 kB) |████████████████████████████████| 319 kB 219 kB/s Collecting protobuf>=3.0.0 Downloading protobuf-3.17.0-cp37-cp37m-macosx_10_9_x86_64.whl (959 kB) |████████████████████████████████| 959 kB 727 kB/s Requirement already satisfied: six>=1.9 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from protobuf>=3.0.0->mysql-connector-python) (1.15.0) Installing collected packages: protobuf, mysql-connector-python Successfully installed mysql-connector-python-8.0.25 protobuf-3.17.0
- Bây giờ khi bạn chạy lệnh
pip show mysql-connector-python
một lần nữa, bạn có thể lấy thông tin cài đặt của nó.$ pip show mysql-connector-python Name: mysql-connector-python Version: 8.0.25 Summary: MySQL driver written in Python Home-page: http://dev.mysql.com/doc/connector-python/en/index.html Author: Oracle and/or its affiliates Author-email: UNKNOWN License: GNU GPLv2 (with FOSS License Exception) Location: /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages Requires: protobuf Required-by:
1.2 Sử dụng mysql-connector-python Các bước kết nối với cơ sở dữ liệu MySQL.
- Nhập mysql.connector lớp.
import mysql.connector
- Gọi mysql.connector.connect () phương thức kết nối với máy chủ cơ sở dữ liệu MySQL.
# get mysql connection object. def open_mysql_connection(user='jerry', password='jerry', host='127.0.0.1', port='3306', database='dev2qa_example', use_unicode=True): conn = mysql.connector.connect(user=user, password=password, host=host, port=port, database=database, use_unicode=use_unicode) return conn
1.3 Thực thi câu lệnh DDL để tạo bảng.
- Nhận con trỏ cơ sở dữ liệu MySQL.
cursor = conn.cursor()
- Thực thi câu lệnh DDL. Nếu bạn muốn thực thi nhiều câu lệnh DDL cùng một lúc, bạn cần tách từng câu lệnh DDL bằng dấu chấm phẩy và bạn nên thêm multi =True tham số
đếnexecute()
của đối tượng con trỏ , nếu không nó sẽ tạo ra lỗi mysql.connector.errors.InterfaceError:Sử dụng multi =True khi thực thi nhiều câu lệnh .def execute_ddl(conn): cursor = conn.cursor() # The below DDL will first drop the table if exist, then create the table. ddl_sql= ''' DROP TABLE user_account; CREATE TABLE `dev2qa_example`.`user_account` ( `id` INT NOT NULL AUTO_INCREMENT, `user_name` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, `email` VARCHAR(45) NULL, PRIMARY KEY (`id`)); ''' # Because the above DDL contains 2 statements ( drop, create), so need to add the multi=True parameter to avoid error mysql.connector.errors.InterfaceError: Use multi=True when executing multiple statements. cursor.execute(ddl_sql, multi=True) cursor.close() conn.close() print(ddl_sql + ' execute successfully.')
1.4 Thực thi câu lệnh DML (Chèn, Cập nhật, Xóa).
- Nhận đối tượng con trỏ kết nối cơ sở dữ liệu MySQL.
- Chạy câu lệnh SQL chèn, cập nhật, xóa bằng
execute()
của đối tượng con trỏdef execute_dml(conn): cursor = conn.cursor() dml_insert = ''' INSERT INTO `dev2qa_example`.`user_account` VALUES (null, %s, %s, %s); ''' cursor.execute(dml_insert, ('tom', 'tom12345678', '[email protected]')) conn.commit() cursor.close() conn.close()
- Nếu bạn muốn chèn nhiều hàng vào bảng MySQL, bạn có thể thực thi
executemany()
của đối tượng con trỏ phương thức.def execute_dml_insert_many(conn): cursor = conn.cursor() dml_insert = ''' INSERT INTO `dev2qa_example`.`user_account` VALUES (null, %s, %s, %s); ''' row_tuple = (('richard', 'richard', '[email protected]'), ('trump', 'trump', '[email protected]'),('doctor', 'doctor', '[email protected]')) cursor.executemany(dml_insert, row_tuple) conn.commit() cursor.close() conn.close()
1.5 Thực thi Câu lệnh SQL Chọn DML.
- Chạy
execute()
của đối tượng con trỏ phương thức để chạy câu lệnh SQL select.def execute_dml_select(conn): cursor = conn.cursor() dml_select = 'SELECT * FROM dev2qa_example.user_account;' cursor.execute(dml_select) # print the row header. for col in cursor.description: print(col[0], end='\t') print('\n-----------------------------') # print each row data. for row in cursor: print(row) print(row[1] + '--->' + row[2]) cursor.close() conn.close()
2. Cách sử dụng PtMySQL để vận hành cơ sở dữ liệu MySQL.
2.1 Cài đặt PyMySQL.
- Trước khi có thể sử dụng PyMySQL, bạn nên cài đặt nó trước. Bạn có thể sử dụng pip để cài đặt như bên dưới.
$ pip3 install PyMySQL
- Bạn có thể chạy
pip3 show
lệnh xác minh cài đặt PyMySQL.$ pip3 show PyMySQL
2.2 Sử dụng PyMySQL để kết nối và vận hành cơ sở dữ liệu MySQL.
Dưới đây là các bước bạn sử dụng thư viện PyMySQL bằng mã Python.
- Nhập PyMSQL kết nối , con trỏ lớp.
from pymysql import connect, cursors
- Gọi kết nối phương thức lấy đối tượng kết nối cơ sở dữ liệu MySQL.
conn = connect(host=host, user=user, password=password, db=db, charset=charset, cursorclass=cursorclass)
- Nhận đối tượng con trỏ cơ sở dữ liệu bằng hàm trỏ () của đối tượng kết nối.
conn.cursor() as cursor:
- Thực thi câu lệnh SQL bằng cách sử dụng đối tượng con trỏ.
cursor.execute(sql)
- Nếu câu lệnh sql là câu lệnh select, thì hãy gọi phương thức fetchall () hoặc fetchone () của đối tượng con trỏ để nhận kết quả thực thi sql. Xin lưu ý sau khi gọi fetchall (), con trỏ sẽ di chuyển đến hàng cuối cùng của kết quả, vì vậy nếu bạn gọi lại phương thức fetchall (), sẽ không có hàng nào được trả về.
row = cursor.fetchall() or row = cursor.fetchone()
- Nếu câu lệnh sql là câu lệnh chèn, cập nhật, xóa, thì hãy gọi hàm commit () của đối tượng kết nối để cam kết các thay đổi đối với cơ sở dữ liệu MySQL có hiệu lực.
conn.commit()
- Đừng quên đóng đối tượng kết nối cơ sở dữ liệu MySQL ở cuối để giải phóng tài nguyên cơ sở dữ liệu.
if conn is not None: conn.close() conn = None
2.3 Ví dụ về vận hành cơ sở dữ liệu MySQL của PyMySQL.
- Trong ví dụ này, tên cơ sở dữ liệu MySQL là dev2qa_example , tên bảng là user_account . Bảng có bốn cột là id , user_name , mật khẩu, và email . Cột id được tăng tự động.
- Mã nguồn python chứa các phương thức để chèn, cập nhật, xóa và chọn dữ liệu tài khoản người dùng như bên dưới.
from pymysql import connect, cursors global_host='127.0.0.1' global_user='jerry' global_password='jerry' global_db='dev2qa_example' global_charset='utf8' global_cursorclass=cursors.DictCursor # get mysql connection object. def open_mysql_connection(host='127.0.0.1', user='jerry', password='jerry', db='dev2qa_example', charset='utf8', cursorclass=cursors.DictCursor): conn = connect(host=host, user=user, password=password, db=db, charset=charset, cursorclass=cursorclass) return conn # close mysql connection. def close_mysql_connection(conn): if conn is not None: conn.close() conn = None # execute insert, update or delete sql command. def execute_insert_update_delete_sql(sql, host, user, password, db, charset, cursorclass): execute_row_count = 0 conn = None print('sql = ' + sql) try: if string_is_not_empty(sql): conn = open_mysql_connection(host, user, password, db, charset, cursorclass) with conn.cursor() as cursor: execute_row_count = cursor.execute(sql) except Exception as ex: print(ex) finally: if conn is not None: conn.commit() close_mysql_connection(conn) return execute_row_count # execute select sql command. def execute_select_sql(sql, host, user, password, db, charset, cursorclass): ret = list() conn = None print('sql = ' + sql) try: if string_is_not_empty(sql): conn = open_mysql_connection(host, user, password, db, charset, cursorclass) with conn.cursor() as cursor: row_count = cursor.execute(sql) print('select return row count = ' + str(row_count)) row = cursor.fetchall() print(row) ret.append(row) except Exception as ex: print(ex) finally: if conn is not None: close_mysql_connection(conn) return ret # insert user account to database table dev2qa_example.user_account. def insert_user_account(user_name, password, email): print('**********Begin insert_user_account.**********') if string_is_not_empty(user_name) and string_is_not_empty(password) and string_is_not_empty(email): # first check whether user account exist or not. sql = "select count(id) as count from dev2qa_example.user_account where lower(user_name) = '"+user_name.lower().strip()+"'" row_list = execute_select_sql(sql, global_host, global_user, global_password, global_db, global_charset, global_cursorclass) account_exist = False for row in row_list: for column in row: exist_count_number = column.get('count') if exist_count_number > 0: account_exist = True if not account_exist: print('User ' + user_name + ' do not exist in database. Insert the user account to database table.') sql = "insert into user_account(user_name, password, email) values('"+user_name+"','"+password+"','"+email+"')" insert_row_count = execute_insert_update_delete_sql(sql, global_host, global_user, global_password, global_db, global_charset, global_cursorclass) print('Insert ' + str(insert_row_count) + ' row data successfully.') else: print('User account exist, can not insert.') else: print('user_name, password, email can not be empty.') print('**********End insert_user_account.**********') # update user account data. def update_user_account(user_name, password, email): print('**********Begin update_user_account.**********') if string_is_not_empty(user_name): sql = "update dev2qa_example.user_account set password = '" + password + "', email = '" + email + "' where lower(user_name) = '" + user_name.lower() + "'" update_row_count = execute_insert_update_delete_sql(sql, global_host, global_user, global_password, global_db, global_charset, global_cursorclass) if update_row_count == 0: print('User account do not exist, insert it now.') insert_user_account(user_name, password, email) else: print('Update ' + str(update_row_count) + ' row data successfully.') else: print('user_name can not be empty.') print('**********End update_user_account.**********') # delete user account data from database table. def delete_user_account(user_name): print('**********Begin delete_user_account.**********') if string_is_not_empty(user_name): sql = "delete from dev2qa_example.user_account where lower(user_name) = '"+user_name.lower()+"'" delete_row_count = execute_insert_update_delete_sql(sql, global_host, global_user, global_password, global_db, global_charset, global_cursorclass) print('Delete ' + str(delete_row_count) + ' row data successfully.') print('**********End delete_user_account.**********') # execute select sql command to get user account data by user_name. def get_user_account_by_user_name(user_name): print('**********Begin get_user_account_by_user_name.**********') sql = "select * from dev2qa_example.user_account where lower(user_name) = '"+user_name.lower().strip()+"'" row_list = execute_select_sql(sql, global_host, global_user, global_password, global_db, global_charset, global_cursorclass) print('**********End get_user_account_by_user_name.**********') # check whether the string is empty or not. def string_is_not_empty(str): if str is None: return False elif len(str.strip()) == 0: return False else: return True if __name__ == '__main__': # first delete user account jerry. delete_user_account('jerry') # then insert a user account jerry into database. insert_user_account('jerry', 'jerry', '[email protected]') # show user account data to verify the insert action. get_user_account_by_user_name('jerry') # update usr account information. update_user_account('jerry', 'jerry888', '[email protected]') # check the updated user account info again. get_user_account_by_user_name('jerry')
- Dưới đây là kết quả thực thi mã ở trên.
**********Begin delete_user_account.********** sql = delete from dev2qa_example.user_account where lower(user_name) = 'jerry' Delete 1 row data successfully. **********End delete_user_account.********** **********Begin insert_user_account.********** sql = select count(id) as count from dev2qa_example.user_account where lower(user_name) = 'jerry' select return row count = 1 [{'count': 0}] User jerry do not exist in database. Insert the user account to database table. sql = insert into user_account(user_name, password, email) values('jerry','jerry','[email protected]') Insert 1 row data successfully. **********End insert_user_account.********** **********Begin get_user_account_by_user_name.********** sql = select * from dev2qa_example.user_account where lower(user_name) = 'jerry' select return row count = 1 [{'id': 42, 'user_name': 'jerry', 'password': 'jerry', 'email': '[email protected]'}] **********End get_user_account_by_user_name.********** **********Begin update_user_account.********** sql = update dev2qa_example.user_account set password = 'jerry888', email = '[email protected]' where lower(user_name) = 'jerry' Update 1 row data successfully. **********End update_user_account.********** **********Begin get_user_account_by_user_name.********** sql = select * from dev2qa_example.user_account where lower(user_name) = 'jerry' select return row count = 1 [{'id': 42, 'user_name': 'jerry', 'password': 'jerry888', 'email': '[email protected]'}] **********End get_user_account_by_user_name.**********
Tài liệu tham khảo
- Cách sử dụng MySql trên Mac