Jeśli chcesz połączyć się z bazą danych MySQL w kodzie Pythona, możesz użyć zarówno mysql-connector-python Sterownik MySQL i PyMySQL . mysql-connector-python Sterownik MySQL to wbudowany sterownik serwera MySQL i PyMySQL jest biblioteką innej firmy.
Wszystkie dwie biblioteki MySQL Python zapewniają klasy umożliwiające uzyskanie połączenia z bazą danych MySQL, wykonanie wstawiania, usuwania, aktualizowania, wybierania polecenia SQL. Wspierają również zarządzanie transakcjami. Ten artykuł pokaże Ci przykład, jak używać mysql-connector-python i PyMySQL do pracy na tabeli bazy danych MySQL.
1. Jak używać mysql-connector-python do obsługi bazy danych MySQL.
1.1 Zainstaluj bibliotekę mysql-connector-python.
- Python mysql-connector- bibliotekę można zainstalować podczas instalacji bazy danych MySQL.
- Możesz więc uruchomić polecenie
pip show mysql-connector-python
aby sprawdzić, czy został zainstalowany, czy nie.$ pip show mysql-connector-python WARNING: Package(s) not found: mysql-connector-python
- Jeśli mysql-connector-python biblioteka nie jest zainstalowana, możesz uruchomić polecenie
pip install mysql-connector-python
aby go zainstalować.$ 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
- Teraz po uruchomieniu polecenia
pip show mysql-connector-python
ponownie, możesz uzyskać informacje o instalacji.$ 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 Użyj mysql-connector-python Połącz z bazą danych MySQL.
- Zaimportuj mysql.connector class.
import mysql.connector
- Wywołaj mysql.connector.connect() metoda połączenia z serwerem bazy danych 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 Wykonaj instrukcję DDL, aby utworzyć tabelę.
- Pobierz kursor bazy danych MySQL.
cursor = conn.cursor()
- Wykonaj instrukcję DDL. Jeśli chcesz wykonać wiele instrukcji DDL jednocześnie, musisz oddzielić każdą instrukcję DDL średnikiem i dodać multi=True
parametr doexecute()
obiektu kursora metody, w przeciwnym razie zgłosi błąd mysql.connector.errors.InterfaceError:Użyj multi=True podczas wykonywania wielu instrukcji .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 Instrukcja wykonania DML (wstaw, zaktualizuj, usuń).
- Pobierz obiekt kursora połączenia z bazą danych MySQL.
- Uruchom wstaw, zaktualizuj, usuń instrukcję SQL za pomocą funkcji
execute()
obiektu kursora 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()
- Jeśli chcesz wstawić wiele wierszy do tabeli MySQL, możesz wykonać funkcję
executemany()
obiektu kursora 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 Wykonaj instrukcję DML Select SQL.
- Uruchom obiekt kursora
execute()
metoda do uruchomienia instrukcji 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. Jak używać PtMySQL do obsługi bazy danych MySQL.
2.1 Zainstaluj PyMySQL.
- Zanim będziesz mógł używać PyMySQL, powinieneś go najpierw zainstalować. Możesz użyć pip do instalacji, jak poniżej.
$ pip3 install PyMySQL
- Możesz uruchomić
pip3 show
polecenie, aby zweryfikować instalację PyMySQL.$ pip3 show PyMySQL
2.2 Użyj PyMySQL do łączenia i obsługi bazy danych MySQL.
Poniżej znajdują się kroki, w których używasz biblioteki PyMySQL w kodzie Pythona.
- Importuj połączenie PyMSQL , kursory class.
from pymysql import connect, cursors
- Zadzwoń połącz metoda uzyskania obiektu połączenia z bazą danych MySQL.
conn = connect(host=host, user=user, password=password, db=db, charset=charset, cursorclass=cursorclass)
- Pobierz obiekt kursora bazy danych przez funkcję obiektu połączenia cursor().
conn.cursor() as cursor:
- Wykonaj instrukcję SQL, używając obiektu kursora.
cursor.execute(sql)
- Jeśli instrukcja sql jest instrukcją select, wywołaj metodę fetchall() lub fetchone() obiektu kursora, aby uzyskać wynik wykonania sql. Należy pamiętać, że po wywołaniu fetchall() kursor przesunie się do ostatniego wiersza wyniku, więc jeśli ponownie wywołasz metodę fetchall(), nie zostanie zwrócony żaden wiersz.
row = cursor.fetchall() or row = cursor.fetchone()
- Jeśli instrukcja sql jest instrukcją insert, update, delete, wywołaj funkcję commit() obiektu połączenia, aby zatwierdzić zmiany w bazie danych MySQL, aby odniosły skutek.
conn.commit()
- Nie zapomnij zamknąć obiektu połączenia z bazą danych MySQL na końcu, aby zwolnić zasoby bazy danych.
if conn is not None: conn.close() conn = None
2.3 PyMySQL Przykład obsługi bazy danych MySQL.
- W tym przykładzie nazwa bazy danych MySQL to dev2qa_example , nazwa tabeli to konto_użytkownika . Tabela ma cztery kolumny, które są id , nazwa_użytkownika , hasło, i e-mail . Kolumna id jest automatycznie zwiększana.
- Kod źródłowy Pythona zawiera metody wstawiania, aktualizowania, usuwania i wybierania danych konta użytkownika, jak poniżej.
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')
- Poniżej znajduje się powyższy wynik wykonania kodu.
**********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.**********
Referencje
- Jak korzystać z MySQL na Macu