sql >> Databáze >  >> RDS >> Mysql

Připojení Pythonu k databázi MySQL pomocí konektoru MySQL a příkladu PyMySQL

Pokud se chcete připojit k databázi MySQL v kódu Python, můžete použít oba mysql-connector-python Ovladač MySQL a PyMySQLmysql-connector-python Ovladač MySQL je vestavěný ovladač serveru MySQL a PyMySQL je knihovna třetí strany.

Všechny dvě knihovny MySQL python poskytují třídy pro získání připojení k databázi MySQL, provedení vložení, odstranění, aktualizace, výběr příkazu SQL. Podporují také správu transakcí. Tento článek vám ukáže příklad, jak používat mysql-connector-python a PyMySQL pracovat s databázovou tabulkou MySQL.

1. Jak používat mysql-connector-python k provozování databáze MySQL.

1.1 Nainstalujte knihovnu mysql-connector-python.

  1. mysql-connector-python knihovnu lze nainstalovat při instalaci databáze MySQL.
  2. Můžete tedy spustit příkaz pip show mysql-connector-python zkontrolujte, zda byl nainstalován nebo ne.
    $ pip show mysql-connector-python
    WARNING: Package(s) not found: mysql-connector-python
  3. Pokud mysql-connector-python knihovna není nainstalována, můžete spustit příkaz pip install mysql-connector-python pro instalaci.
    $ 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. Nyní, když spustíte příkaz pip show mysql-connector-python opět můžete získat informace o instalaci.
    $ 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 Použití mysql-connector-python Kroky připojení k databázi MySQL.

  1. Importujte mysql.connector class.
    import mysql.connector
  2. Vyvolejte mysql.connector.connect() metoda pro připojení k databázovému serveru 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 Provedení příkazu DDL pro vytvoření tabulky.

  1. Získejte kurzor databáze MySQL.
    cursor = conn.cursor()
  2. Proveďte příkaz DDL. Pokud chcete provést více příkazů DDL najednou, musíte každý příkaz DDL oddělit středníkem a přidat multi=True
    parametr pro objekt kurzoru execute() metoda, jinak vyvolá chybu mysql.connector.errors.InterfaceError:Při provádění více příkazů použijte 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 Provedení příkazu DML ( Insert, Update, Delete ).

  1. Získejte objekt kurzoru připojení databáze MySQL.
  2. Spusťte vložení, aktualizaci, odstranění příkazu SQL pomocí příkazu execute() kurzorového objektu metoda.
    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. Pokud chcete do tabulky MySQL vložit více řádků, můžete spustit příkaz executemany() kurzorového objektu metoda.
    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 Spustit DML Vyberte příkaz SQL.

  1. Spusťte execute() objektu kurzoru metoda pro spuštění příkazu SQL 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. Jak používat PtMySQL k provozování databáze MySQL.

2.1 Nainstalujte PyMySQL.

  1. Než budete moci používat PyMySQL, měli byste jej nainstalovat. K instalaci můžete použít pip, jak je uvedeno níže.
    $ pip3 install PyMySQL
  2. Můžete spustit pip3 show příkaz k ověření instalace PyMySQL.
    $ pip3 show PyMySQL

2.2 Použití PyMySQL k připojení a provozu databáze MySQL.

Níže jsou uvedeny kroky, které používáte PyMySQL knihovnu v kódu Pythonu.

  1. Importujte připojení PyMSQL , kurzory class.
    from pymysql import connect, cursors
  2. Zavolejte na připojení metoda k získání objektu připojení k databázi MySQL.
    conn = connect(host=host, user=user, password=password, db=db, charset=charset, cursorclass=cursorclass)
  3. Získejte databázový kurzor pomocí funkce kurzor() objektu připojení.
    conn.cursor() as cursor:
  4. Proveďte příkaz SQL pomocí objektu kurzoru.
    cursor.execute(sql)
  5. Pokud je příkaz sql příkazem select, pak zavolejte metodu fetchall() nebo fetchone() objektu kurzoru, abyste získali výsledek provedení sql. Upozorňujeme, že po vyvolání fetchall() se kurzor přesune na poslední řádek výsledku, takže pokud znovu zavoláte metodu fetchall(), nebude vrácen žádný řádek.
    row = cursor.fetchall()
    
    or
    
    row = cursor.fetchone()
  6. Pokud je příkaz sql příkazem insert, update, delete, pak zavolejte funkci commit() objektu připojení, aby se změny projevily v databázi MySQL.
    conn.commit()
  7. Nezapomeňte na konci zavřít objekt připojení k databázi MySQL, abyste uvolnili zdroje databáze.
    if conn is not None:
            conn.close()
            conn = None

2.3 PyMySQL Příklad provozu databáze MySQL.

  1. V tomto příkladu je název databáze MySQL dev2qa_example , název tabulky je user_account . Tabulka má čtyři sloupce, které jsou id , uživatelské_jméno , heslo, a e-mail . Sloupec id se automaticky zvyšuje.
  2. Zdrojový kód pythonu obsahuje metody pro vkládání, aktualizaci, mazání a výběr dat uživatelského účtu, jak je uvedeno níže.
    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. Níže je výše uvedený výsledek spuštění kódu.
    **********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.**********

Odkazy

  1. Jak používat MySql na Macu

  1. SQL Server ekvivalentní GROUP_CONCAT()

  2. Přidat ID automatického přírůstku do stávající tabulky?

  3. Jak získat přístup k PhpMyAdmin bez přihlášení k cPanel

  4. Událost čekání:změna velikosti asynchronního deskriptoru