Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Python-Verbindung zur MySQL-Datenbank mit MySQL-Connector und PyMySQL-Beispiel

Wenn Sie in Python-Code eine Verbindung zur MySQL-Datenbank herstellen möchten, können Sie sowohl den mysql-connector-python MySQL-Treiber und PyMySQL . Die mysql-connector-python Der MySQL-Treiber ist ein in den MySQL-Server integrierter Treiber und der PyMySQL ist eine Bibliothek eines Drittanbieters.

Alle zwei MySQL-Python-Bibliotheken bieten Klassen, mit denen Sie eine MySQL-Datenbankverbindung herstellen, Einfügen, Löschen, Aktualisieren und SQL-Befehle auswählen können. Sie unterstützen auch das Transaktionsmanagement. Dieser Artikel zeigt Ihnen ein Beispiel für die Verwendung von mysql-connector-python und PyMySQL um auf MySQL-Datenbanktabellen zu arbeiten.

1. So verwenden Sie mysql-connector-python zum Betreiben einer MySQL-Datenbank.

1.1 mysql-connector-python-Bibliothek installieren.

  1. Der mysql-connector-python Bibliothek kann installiert werden, wenn Sie die MySQL-Datenbank installieren.
  2. Sie können also den Befehl pip show mysql-connector-python ausführen um zu überprüfen, ob es installiert wurde oder nicht.
    $ pip show mysql-connector-python
    WARNING: Package(s) not found: mysql-connector-python
  3. Falls die mysql-connector-python Bibliothek nicht installiert ist, können Sie den Befehl pip install mysql-connector-python ausführen um es zu installieren.
    $ 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
    
  4. Wenn Sie jetzt den Befehl pip show mysql-connector-python ausführen Auch hier können Sie die Installationsinformationen abrufen.
    $ 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 Verwenden Sie die mysql-connector-python-Schritte zur Verbindung mit der MySQL-Datenbank.

  1. Importieren Sie den mysql.connector class.
    import mysql.connector
  2. Rufen Sie mysql.connector.connect() auf Methode zum Verbinden mit dem MySQL-Datenbankserver.
    # 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-Anweisung ausführen, um eine Tabelle zu erstellen.

  1. MySQL-Datenbankcursor abrufen.
    cursor = conn.cursor()
  2. DDL-Anweisung ausführen. Wenn Sie mehrere DDL-Anweisungen gleichzeitig ausführen möchten, müssen Sie jede DDL-Anweisung durch ein Semikolon trennen und multi=True hinzufügen
    Parameter zum execute() des Cursor-Objekts -Methode, andernfalls wird der Fehler mysql.connector.errors.InterfaceError:Use multi=True when running multiple Statements ausgegeben .

    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-Anweisung ( Insert, Update, Delete ) ausführen.

  1. MySQL-Datenbankverbindungs-Cursor-Objekt abrufen.
  2. Führen Sie die SQL-Anweisung zum Einfügen, Aktualisieren und Löschen mit execute() des Cursorobjekts aus 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()
    
  3. Wenn Sie mehrere Zeilen in die MySQL-Tabelle einfügen möchten, können Sie executemany() des Cursor-Objekts ausführen 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-Select-SQL-Anweisung ausführen.

  1. Führen Sie execute() des Cursor-Objekts aus Methode zum Ausführen der ausgewählten SQL-Anweisung.
    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. So verwenden Sie PtMySQL zum Betreiben einer MySQL-Datenbank.

2.1 PyMySQL installieren.

  1. Bevor Sie PyMySQL verwenden können, sollten Sie es zuerst installieren. Sie können pip zur Installation wie unten verwenden.
    $ pip3 install PyMySQL
  2. Sie können pip3 show ausführen Befehl, um die PyMySQL-Installation zu überprüfen.
    $ pip3 show PyMySQL

2.2 Verwenden Sie PyMySQL zum Verbinden und Betreiben einer MySQL-Datenbank.

Nachfolgend sind die Schritte aufgeführt, mit denen Sie die PyMySQL-Bibliothek in Python-Code verwenden.

  1. Importieren Sie die PyMSQL-Verbindung , Cursor class.
    from pymysql import connect, cursors
  2. Ruf connect an Methode zum Abrufen des Verbindungsobjekts der MySQL-Datenbank.
    conn = connect(host=host, user=user, password=password, db=db, charset=charset, cursorclass=cursorclass)
  3. Datenbank-Cursor-Objekt durch Cursor()-Funktion des Verbindungsobjekts abrufen.
    conn.cursor() as cursor:
  4. Führen Sie die SQL-Anweisung mit dem Cursor-Objekt aus.
    cursor.execute(sql)
  5. Wenn die SQL-Anweisung eine Select-Anweisung ist, rufen Sie die Methode fetchall() oder fetchone() des Cursor-Objekts auf, um das Ergebnis der SQL-Ausführung zu erhalten. Bitte beachten Sie, dass sich der Cursor nach dem Aufruf von fetchall() in die letzte Zeile des Ergebnisses bewegt. Wenn Sie also die Methode fetchall() erneut aufrufen, wird keine Zeile zurückgegeben.
    row = cursor.fetchall()
    
    or
    
    row = cursor.fetchone()
  6. Wenn die SQL-Anweisung eine Insert-, Update-, Delete-Anweisung ist, rufen Sie die commit()-Funktion des Verbindungsobjekts auf, um die Änderungen an die MySQL-Datenbank zu übertragen, damit sie wirksam werden.
    conn.commit()
  7. Vergessen Sie nicht, das Verbindungsobjekt der MySQL-Datenbank am Ende zu schließen, um Datenbankressourcen freizugeben.
    if conn is not None:
            conn.close()
            conn = None

2.3 PyMySQL betreibt MySQL-Datenbankbeispiel.

  1. In diesem Beispiel lautet der Name der MySQL-Datenbank dev2qa_example , lautet der Tabellenname user_account . Die Tabelle hat vier Spalten, die id sind , Benutzername , Passwort, und E-Mail . Die ID-Spalte wird automatisch erhöht.
  2. Der Python-Quellcode enthält Methoden zum Einfügen, Aktualisieren, Löschen und Auswählen von Benutzerkontodaten wie unten.
    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')
  3. Unten ist das obige Ergebnis der Codeausführung.
    **********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.**********

Referenzen

  1. So verwenden Sie MySql auf dem Mac