Python操作MySQL資料庫

2021-09-29 01:41:27 字數 3741 閱讀 8852

通過python連線mysql資料庫有很多庫,這裡使用官方推薦的mysql connector/python庫,其官網為:

通過pip命令安裝:

pip install mysql-connector-python
預設安裝的是最新的版本,我安裝的是8.0.17,對應mysql的8.0版本。mysql統一了其相關工具的大版本號,必須相同或更高才可以相容。例如我使用的是mysql8.0,如果使用低於8的mysql-connector就會報錯。事實上也是這樣,在某些舊的文件中提示安裝pip install mysql-connector,就會安裝較低的版本,在連線mysql時,會報錯如下:

mysql.connector.errors.notsupportederror: authentication plugin 'caching_sha2_password' is not supported

這是由於mysql8.0使用了use strong password encryption for authentication即強密碼加密,而低版本的mysql-connector採用舊的mysql_native_password加密方式,導致無法連線,因此注意使用和資料庫相相容的版本。

可以通過connector類的connect()方法進行資料庫的連線,傳入伺服器、埠號、使用者名稱、密碼、資料庫等引數,其中伺服器與埠號可省略,預設為localhost:3306。

import mysql.connector

db = mysql.connector.connect(

host='localhost',

port='3306',

user="root",

password="123456",

database="test"

)

對資料庫、資料表的操作屬於模式定義語言(ddl),所有ddl語句的執行都是依賴於乙個叫cursor的資料結構進行操作的。通過從connect物件中獲取cursor物件後就可以進行資料庫、表的相關操作了。例如建立乙個資料庫、資料表

# 獲取資料庫的cursor

cursor = db.cursor()

# 建立資料庫

cursor.execute("create database mydatabase")

# 建立資料表

dbcursor.execute("create table customers (name varchar(255),address varchar(255))")

# 修改表操作

dbcursor.execute('alter table customers add column id int primary key auto_increment')

# 查詢並列印資料庫中的所有表

cursor.execute("show tables")

for table in cursor:

print(table)

插入、刪除、修改操作依舊是通過cursor物件來實現,通過cursor的execute()方法執行sql操作,第乙個引數是要執行的sql語句,第二個引數是語句中要填充的變數。

在執行完所有的sql操作後記得要通過資料庫物件的commit()將操作事務提交到資料庫,如果需要撤銷則通過rollback()方法回滾操作。

sql語句中的變數可以用%s的形式作為佔位符,然後再以python中元組的形式在執行時將變數填入,如下所示:

值得注意的是無論是什麼型別的資料在傳入時都被當做字串型別,然後在執行sql操作時會將字串轉化為相應的型別,因此此處的佔位符都是%s,而沒有%d、%f等。

# 要執行的sql語句

sql = "insert into customers (name, address) values (%s, %s)"

# 以元組的形式填入資料

val = ('mike', 'main street 20')

# 執行操作

cursor.execute(sql, val)

# 提交事務

db.commit()

也可以用python中字典的形式填充變數,在sql語句中的佔位符需要使用對應的變數名

# 在sql語句中指明變數名

sql = "insert into customers (name, address) values (%(name)s, %(address)s)"

# 以字典的形式填入資料

val =

cursor.execute(sql, val)

如果需要一次插入多條資料,可以使用executemany()方法,將多條資料以陣列的方式傳給第二個引數。

通過cursor的rowcount屬性可以返回成功操作的資料條數,lastrowid屬性是最後乙個成功插入的行的id

sql = "insert into customers (name, address) values (%s, %s)"

# 以陣列的形式填充資料

val = [

('peter', 'lowstreet 4'),

('hannah', 'mountain 21'),

]cursor.executemany(sql, val)

print("成功插入%d條資料,最後一條的id為:%d" % (cursor.rowcount, cursor.lastrowid))

修改、刪除資料的方法與插入類似,只需要把對應的sql語句和變數值傳給execute()函式即可。可以看出mysql-connector庫的操作是非常貼近原生sql語言的。

# 修改資料

sql = "update customers set address=%s where name=%s"

val = ('center street 21', 'mike')

cursor.execute(sql, val)

# 刪除資料

sql = "delete from customers where name=%s"

val = ('hannah',)

cursor.execute(sql, val)

執行查詢操作和之前類似,都是通過execute()執行對應的sql語句,在執行時將相應的資料填入即可。查詢結束後,結果集會儲存在cursor當中,可以直接把cursor當作迭代器iterator來進行展開取得結果集中每條資料的對應字段。也可以通過cursor的fetchall()、fetchone()方法取得所有或一條結果集。

# 查詢customers表中id介於6到8之間的資料並返回name、address欄位

query = "select name,address from customers where id between %s and %s"

cursor.execute(query, (6, 8))

# 迴圈取出結果集中的每條資料並列印

for (name, address) in cursor:

print("%s家的位址是%s" % (name, address))

# 輸出結果為:

# peter家的位址是lowstreet 4

# hannah家的位址是mountain 21

通過原生的sql語句可以進行更為複雜的查詢操作,例如通過where設定查詢條件、order by進行字段排序、limit設定返回結果條數、offset查詢結果集的偏移、join進行表連線操作

python操作mysql查詢資料

首先需要連線資料庫,然後才查詢出資料。例如下表名字為 sinauser iduse id use name11 db12 2db233 db3class database def init self self.conn mysqldb.connect 連線資料庫 host 連線你要取出資料庫的ip,...

python操作MySQL資料庫

堅持每天學一點,每天積累一點點,作為自己每天的業餘收穫,這個文章是我在吃飯的期間寫的,利用自己零散的時間學了一下python操作mysql,所以整理一下。我採用的是mysqldb操作的mysql資料庫。先來乙個簡單的例子吧 import mysqldb try conn mysqldb.connec...

Python操作Mysql資料庫

coding utf8 author yangjing import mysqldb 查詢。def select host user root password port 3306,db sql connect mysqldb.connect host host,user user,passwd p...