Quando vuoi connetterti al database MySQL in codice Python, puoi utilizzare sia il mysql-connector-python Driver MySQL e PyMySQL . Il mysql-connector-python Il driver MySQL è un driver integrato del server MySQL e il PyMySQL è una libreria di terze parti.
Tutte le due librerie python MySQL forniscono classi per ottenere la connessione al database MySQL, eseguire inserimento, eliminazione, aggiornamento, selezione del comando SQL. Supportano anche la gestione delle transazioni. Questo articolo ti mostrerà un esempio di come usare mysql-connector-python e PyMySQL per operare sulla tabella del database MySQL.
1. Come utilizzare mysql-connector-python per gestire il database MySQL.
1.1 Installa la libreria mysql-connector-python.
- Il connettore-mysql-python la libreria può essere installata durante l'installazione del database MySQL.
- Quindi puoi eseguire il comando
pip show mysql-connector-python
per verificare se è stato installato o meno.$ pip show mysql-connector-python WARNING: Package(s) not found: mysql-connector-python
- Se il mysql-connector-python libreria non è installata, puoi eseguire il comando
pip install mysql-connector-python
per installarlo.$ 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
- Ora, quando esegui il comando
pip show mysql-connector-python
di nuovo, puoi ottenere le sue informazioni sull'installazione.$ 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 Utilizzare mysql-connector-python Passaggi per la connessione al database MySQL.
- Importa il mysql.connector class.
import mysql.connector
- Richiama mysql.connector.connect() metodo per connettersi al server di database 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 Eseguire l'istruzione DDL per creare una tabella.
- Ottieni il cursore del database MySQL.
cursor = conn.cursor()
- Esegui istruzione DDL. Se desideri eseguire più istruzioni DDL contemporaneamente, devi separare ciascuna istruzione DDL con un punto e virgola e aggiungere multi=True
parametro alexecute()
dell'oggetto cursore metodo, altrimenti genererà l'errore mysql.connector.errors.InterfaceError:Usa multi=True quando si eseguono più istruzioni .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 Esegui istruzione DML (Inserisci, Aggiorna, Elimina).
- Ottieni l'oggetto cursore di connessione al database MySQL.
- Esegui l'istruzione SQL di inserimento, aggiornamento, eliminazione con
execute()
dell'oggetto cursore 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()
- Se vuoi inserire più righe nella tabella MySQL, puoi eseguire
executemany()
dell'oggetto cursore 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 Esegui DML Seleziona istruzione SQL.
- Esegui
execute()
dell'oggetto cursore metodo per eseguire select istruzione 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. Come utilizzare PtMySQL per gestire il database MySQL.
2.1 Installa PyMySQL.
- Prima di poter usare PyMySQL, dovresti prima installarlo. Puoi usare pip per installare come di seguito.
$ pip3 install PyMySQL
- Puoi eseguire
pip3 show
comando per verificare l'installazione di PyMySQL.$ pip3 show PyMySQL
2.2 Usa PyMySQL per connettere e far funzionare il database MySQL.
Di seguito sono riportati i passaggi per utilizzare la libreria PyMySQL nel codice Python.
- Importa il PyMSQL connect , cursori class.
from pymysql import connect, cursors
- Chiama connetti metodo per ottenere l'oggetto di connessione al database MySQL.
conn = connect(host=host, user=user, password=password, db=db, charset=charset, cursorclass=cursorclass)
- Ottieni l'oggetto cursore del database tramite la funzione cursor() dell'oggetto di connessione.
conn.cursor() as cursor:
- Esegui l'istruzione SQL utilizza l'oggetto cursore.
cursor.execute(sql)
- Se l'istruzione sql è un'istruzione select, chiama il metodo fetchall() o fetchone() dell'oggetto cursore per ottenere il risultato dell'esecuzione sql. Si noti che dopo aver invocato fetchall(), il cursore si sposterà sull'ultima riga del risultato, quindi se si chiama nuovamente il metodo fetchall(), non verrà restituita alcuna riga.
row = cursor.fetchall() or row = cursor.fetchone()
- Se l'istruzione sql è un'istruzione insert, update, delete, quindi chiamare la funzione commit() dell'oggetto di connessione per eseguire il commit delle modifiche al database MySQL affinché abbiano effetto.
conn.commit()
- Non dimenticare di chiudere l'oggetto di connessione al database MySQL alla fine per rilasciare le risorse del database.
if conn is not None: conn.close() conn = None
2.3 Esempio di database MySQL con PyMySQL.
- In questo esempio, il nome del database MySQL è dev2qa_example , il nome della tabella è account_utente . La tabella ha quattro colonne che sono id , nome_utente , password, e e-mail . La colonna id viene incrementata automaticamente.
- Il codice sorgente python contiene metodi per inserire, aggiornare, eliminare e selezionare i dati dell'account utente come di seguito.
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')
- Di seguito è riportato il risultato dell'esecuzione del codice sopra.
**********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.**********
Riferimenti
- Come utilizzare MySql su Mac