Когато искате да се свържете с базата данни MySQL в код на Python, можете да използвате и двата mysql-connector-python MySQL драйвер и PyMySQL . mysql-connector-python MySQL драйверът е вграден драйвер в MySQL сървъра и PyMySQL е библиотека на трета страна.
Всичките две MySQL python библиотеки предоставят класове, за да получите връзка с MySQL база данни, да изпълните вмъкване, изтриване, актуализиране, изберете SQL команда. Те също така поддържат управлението на транзакциите. Тази статия ще ви покаже пример как да използвате mysql-connector-python и PyMySQL за работа с таблицата на базата данни MySQL.
1. Как да използвате mysql-connector-python за работа с MySQL база данни.
1.1 Инсталирайте библиотеката mysql-connector-python.
- mysql-connector-python библиотеката може да бъде инсталирана, когато инсталирате базата данни MySQL.
- Така че можете да изпълните командата
pip show mysql-connector-python
за да проверите дали е инсталиран или не.$ pip show mysql-connector-python WARNING: Package(s) not found: mysql-connector-python
- Ако mysql-connector-python библиотеката не е инсталирана, можете да изпълните командата
pip install mysql-connector-python
за да го инсталирате.$ 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
- Сега, когато изпълните командата
pip show mysql-connector-python
отново можете да получите информацията за инсталирането му.$ 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 Използвайте mysql-connector-python стъпки за свързване към MySQL база данни.
- Импортирайте mysql.connector клас.
import mysql.connector
- Извикайте mysql.connector.connect() метод за свързване към сървъра на базата данни 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 Изпълнете DDL оператор, за да създадете таблица.
- Вземете курсора на базата данни MySQL.
cursor = conn.cursor()
- Изпълнете DDL оператор. Ако искате да изпълните няколко DDL оператора наведнъж, трябва да разделите всеки DDL израз с точка и запетая и трябва да добавите multi=True
параметър къмexecute()
на обекта на курсора метод, в противен случай ще изведе грешката mysql.connector.errors.InterfaceError:Използвайте multi=True, когато изпълнявате множество изрази .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 Изпълнете DML (вмъкване, актуализиране, изтриване) изявление.
- Вземете обекта на курсора за свързване на MySQL базата данни.
- Изпълнете SQL израза за вмъкване, актуализиране, изтриване с
execute()
на обекта на курсора method.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()
- Ако искате да вмъкнете няколко реда в MySQL таблицата, можете да изпълните
executemany()
на обекта на курсора method.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 Изпълнение на DML Изберете SQL изявление.
- Изпълнете
execute()
на обекта на курсора метод за изпълнение на избран SQL оператор.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. Как да използвате PtMySQL за работа с MySQL база данни.
2.1 Инсталирайте PyMySQL.
- Преди да можете да използвате PyMySQL, първо трябва да го инсталирате. Можете да използвате pip за инсталиране, както е по-долу.
$ pip3 install PyMySQL
- Можете да стартирате
pip3 show
команда за проверка на инсталирането на PyMySQL.$ pip3 show PyMySQL
2.2 Използвайте PyMySQL за свързване и работа с MySQL база данни.
По-долу са стъпките, които използвате PyMySQL библиотека в Python код.
- Импортирайте PyMSQL connect , курсори class.
from pymysql import connect, cursors
- Обадете се connect метод за получаване на обект за връзка с базата данни MySQL.
conn = connect(host=host, user=user, password=password, db=db, charset=charset, cursorclass=cursorclass)
- Вземете обекта курсор на базата данни чрез функцията cursor() на обекта за връзка.
conn.cursor() as cursor:
- Изпълнете SQL израза, използвайте обекта курсор.
cursor.execute(sql)
- Ако операторът sql е оператор select, тогава извикайте метода fetchall() или fetchone() на обекта на курсора, за да получите резултата от изпълнението на sql. Моля, имайте предвид, че след извикване на fetchall(), курсорът ще се премести до последния ред на резултата, така че ако извикате метода fetchall() отново, няма да бъде върнат ред.
row = cursor.fetchall() or row = cursor.fetchone()
- Ако операторът sql е израз за вмъкване, актуализиране, изтриване, тогава извикайте функцията commit() на обекта за свързване, за да зададете промените в базата данни MySQL, за да влязат в сила.
conn.commit()
- Не забравяйте да затворите обекта за връзка с базата данни MySQL в края, за да освободите ресурсите на базата данни.
if conn is not None: conn.close() conn = None
2.3 Пример за PyMySQL Operate MySQL база данни.
- В този пример името на базата данни MySQL е dev2qa_example , името на таблицата е user_account . Таблицата има четири колони, които са id , потребителско_име , парола, и имейл . Колоната с идентификатор се увеличава автоматично.
- Изходният код на python съдържа методи за вмъкване, актуализиране, изтриване и избор на данни за потребителски акаунт, както е по-долу.
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')
- По-долу е резултатът от изпълнението на кода по-горе.
**********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.**********
Препратки
- Как да използвате MySql на Mac