[Python] Vom Anfang bis zum Anfang – MySQL-Datenbankbetriebsmodul MySQL-Connector und PyMySQL-Anwendungsszenarien (15)

MySQL-Connector

MySQL stellt offiziell den mysql-connector-python-Treiber zur Verfügung

  1. Installiere Treiber

    python -m pip install mysql-connector
    
  2. Stellen Sie eine Verbindung zur Datenbank her, um die Verbindung herzustellen

    import mysql.connector
    
    db = mysql.connector.connect(
        host="localhost", #ip
        user="root", #用户名
        passwd="root",#密码
        database="python_test",#连接数据库
        auth_plugin='mysql_native_password'
    )
    #获取游标
    cursor = db.cursor()
    

Datenbank erstellen

cursor.execute("CREATE DATABASE python_test")

Eine Liste aller Datenbanken ausgeben:

cursor.execute("SHOW DATABASES")
for x in cursor:
    print(x)
"""
('basic_project',)
('ceam_mall2',)
('information_schema',)
('jwt-demo',)
('liugh',)
('mysql',)
('niu_b_xx_hou',)
"""

Datentabelle erstellen

cursor.execute("CREATE TABLE sites (name VARCHAR(255), url VARCHAR(255))")

Alle Datenbanktabellen ausgeben:

cursor.execute("SHOW TABLES")
for x in cursor:
    print(x)
#('sites',)

Primärschlüsseleinstellungen

cursor.execute("ALTER TABLE sites ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY")

Daten einfügen

#sql
sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
#占位符插入数据
val = ("RUNOOB", "https://www.baidu.com")
#执行sql
cursor.execute(sql, val)

db.commit()
print(cursor.rowcount, "记录插入成功。")

Batch-Einfügung

  • Batch-Einfügemethode executemany() , der zweite Parameter dieser Methode ist eine Liste von Tupeln, die die Daten enthalten, die wir einfügen möchten:
sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
val = [
    ('Google', 'https://www.google.com'),
    ('Github', 'https://www.github.com'),
    ('Taobao', 'https://www.taobao.com'),
    ('stackoverflow', 'https://www.stackoverflow.com/')
]
#执行sql
cursor.executemany(sql, val)
#提交事务: 数据表内容有更新,必须使用到该语句
db.commit()
print(cursor.rowcount, "记录插入成功。")

Wenn wir nach dem Einfügen die ID des Datensatzes erhalten möchten, können wir den folgenden Code verwenden:

sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
val = ("Zhihu", "https://www.zhihu.com")
cursor.execute(sql, val)
db.commit()
print("1 条记录已插入, ID:", cursor.lastrowid)

Daten abfragen

cursor.execute("SELECT * FROM sites")
result = cursor.fetchall()  # fetchall() 获取所有记录
for x in result:
	print(x)
"""
('RUNOOB', 'https://www.runoob.com', 1)
('Google', 'https://www.google.com', 2)
('Github', 'https://www.github.com', 3)
('Taobao', 'https://www.taobao.com', 4)
('stackoverflow', 'https://www.stackoverflow.com/', 5)
('Zhihu', 'https://www.zhihu.com', 6)
"""

Wenn wir nur ein Datenelement lesen möchten, können wir die Methode fetchone() verwenden:

cursor.execute("SELECT * FROM sites")
result = cursor.fetchone()
print(result)

Um SQL-Injection-Angriffe in Datenbankabfragen zu verhindern, können wir Folgendes verwenden %s 占位符来转义查询的条件:

sql = "SELECT * FROM sites WHERE name = %s"
na = ("RUNOOB",)
cursor.execute(sql, na)
result = cursor.fetchall()
for x in result:
    print(x)

löschen

sql = "DELETE FROM sites WHERE name = %s"
na = ("stackoverflow",)
cursor.execute(sql, na)
db.commit()
print(cursor.rowcount, " 条记录删除")

erneuern

sql = "UPDATE sites SET name = %s WHERE name = %s"
val = ("Zhihu", "ZH")
cursor.execute(sql, val)
db.commit()
print(cursor.rowcount, " 条记录被修改")

Verbindung schließen

#最后一定要关闭数据库连接
db.close()

Python-Fehler: MySQL-Fehler: mysql.connector.errors.NotSupportedError: Das Authentifizierungs-Plugin „caching_sha2_password“ wird nicht unterstützt

  • Fügen Sie eine Anweisung hinzu (auth_plugin='mysql_native_password') und fügen Sie den folgenden Code hinzu:

Fügen Sie hier eine Bildbeschreibung ein

Zusammenfassung

  • commit()Eine Commit-Transaktion muss aufgerufen werden, nachdem Vorgänge wie INSERT/UPDATE/DELETE ausgeführt wurden .
  • SQL-Platzhalter für MySQL sind %s.

PyMySQL

PyMySQL ist in Python3.x 版本中用于连接 MySQL 服务器的一个库und Python2 verwendet mysqldb.

  • PyMySQL folgt Python 数据库 API v2.0 规范und enthält 了 pure-Python MySQL Client-Bibliotheken.
  1. Installieren

    pip3 install PyMySQL
    
  2. Datenbankkonnektivität

    import pymysql
     
    # 打开数据库连接
    db = pymysql.connect(host='localhost',
                         user='root',
                         password='root',
                         database='python_test')
     
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = db.cursor()
     
    # 使用 execute()  方法执行 SQL 查询 
    cursor.execute("SELECT VERSION()")
     
    # 使用 fetchone() 方法获取单条数据.
    data = cursor.fetchone()
     
    print ("Database version : %s " % data)
     
    # 关闭数据库连接
    db.close()
    

Erstellen Sie eine Datenbanktabelle

import pymysql
 
# 打开数据库连接
db = pymysql.connect(host='localhost',
                     user='testuser',
                     password='test123',
                     database='TESTDB')
 
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
 
# 使用 execute() 方法执行 SQL,如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
 
# 使用预处理语句创建表
sql = """CREATE TABLE EMPLOYEE (
         FIRST_NAME  CHAR(20) NOT NULL,
         LAST_NAME  CHAR(20),
         AGE INT,  
         SEX CHAR(1),
         INCOME FLOAT )"""
 
cursor.execute(sql)
 
# 关闭数据库连接
db.close()

Datenbankeinfügungsvorgang

import pymysql
 
# 打开数据库连接
db = pymysql.connect(host='localhost',
                     user='testuser',
                     password='test123',
                     database='TESTDB')
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 插入语句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
         LAST_NAME, AGE, SEX, INCOME)
         VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
   # 执行sql语句
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # 如果发生错误则回滚
   db.rollback()
 
# 关闭数据库连接
db.close()

Das obige Beispiel kann auch in der folgenden Form geschrieben werden:

import pymysql
 
# 打开数据库连接
db = pymysql.connect(host='localhost',
                     user='testuser',
                     password='test123',
                     database='TESTDB')
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 插入语句
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
       LAST_NAME, AGE, SEX, INCOME) \
       VALUES ('%s', '%s',  %s,  '%s',  %s)" % \
       ('Mac', 'Mohan', 20, 'M', 2000)
try:
   # 执行sql语句
   cursor.execute(sql)
   # 执行sql语句
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()
 
# 关闭数据库连接
db.close()

Datenbankabfragevorgänge

  • Python fragt MySQL mit der Methode fetchone() ab, um ein einzelnes Datenelement zu erhalten, und mit der Methode fetchall(), um mehrere Datenelemente abzurufen.

    • fetchone(): Diese Methode ruft die nächste Abfrageergebnismenge ab. Die Ergebnismenge ist ein Objekt
    • fetchall(): Alle zurückgegebenen Ergebniszeilen empfangen.
    • rowcount: Dies ist eine schreibgeschützte Eigenschaft und gibt die Anzahl der betroffenen Zeilen nach der Ausführung der Methodeexecute() zurück.

Fragen Sie alle Daten in der EMPLOYEE-Tabelle ab, deren Gehaltsfeld größer als 1000 ist:

import pymysql
 
# 打开数据库连接
db = pymysql.connect(host='localhost',
                     user='testuser',
                     password='test123',
                     database='TESTDB')
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 查询语句
sql = "SELECT * FROM EMPLOYEE \
       WHERE INCOME > %s" % (1000)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 获取所有记录列表
   results = cursor.fetchall()
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      income = row[4]
       # 打印结果
      print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
             (fname, lname, age, sex, income ))
except:
   print ("Error: unable to fetch data")
 
# 关闭数据库连接
db.close()

Datenbankaktualisierungsvorgang

  • Erhöhen Sie das AGE-Feld in der TESTDB-Tabelle mit SEX von „M“ um 1:
import pymysql
 
# 打开数据库连接
db = pymysql.connect(host='localhost',
                     user='testuser',
                     password='test123',
                     database='TESTDB')
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 更新语句
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()
 
# 关闭数据库连接
db.close()

Vorgang löschen

  • Löschen Sie alle Daten in der Datentabelle MITARBEITER mit ALTER größer als 20:
import pymysql
 
# 打开数据库连接
db = pymysql.connect(host='localhost',
                     user='testuser',
                     password='test123',
                     database='TESTDB')
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 删除语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 提交修改
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()
 
# 关闭连接
db.close()

Transaktion ausführen

  • Python DB API 2.0-Transaktionen bieten zwei Methoden commit 或 rollback.
# SQL删除记录语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 向数据库提交
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()
  • Bei Datenbanken, die Transaktionen unterstützen, wird bei der Python-Datenbankprogrammierung beim Erstellen des Cursors automatisch eine unsichtbare Datenbanktransaktion gestartet.

    • Die Methode commit() schreibt alle Aktualisierungsvorgänge des aktuellen Cursors fest und die Methode rollback() setzt alle Vorgänge des aktuellen Cursors zurück. Jede Methode startet eine neue Transaktion.

Ich denke du magst

Origin blog.csdn.net/qq877728715/article/details/132853653
Empfohlen
Rangfolge