鑒于是入門系列教程,我們在數(shù)據(jù)庫種類上且不做拓展,僅以MySQL為例。
目錄:
一、mysql-connector
二、PyMySQL
三、mysqlclient
四、SQLAlchemy
Python3下MySQL數(shù)據(jù)庫操作有有多種方法:首先是mysql-connector和PyMySQL,區(qū)別在于前者是MySQL 官方提供的驅(qū)動器,后者是python3中提供的第三方庫,這兩者的共同點是皆為python開發(fā),所以基于語言的特性效率并不高。使用過python2的小伙伴都知道python2中有一個MySQLdb庫,它是對C語言操作MySQL數(shù)據(jù)庫的一個簡單封裝,因為底層語言的特性其運行效率極高,然而在python3中取消掉了。但mysqlclient作為MySQLdb的分支卻對python3保留著良好的兼容性并最終保留了下來,這也是我最終推薦的方式,欲知詳情,且看下文~
一、mysql-connector
首先,自行安裝mysql-connector:pip3 install mysql-connector
我們來感受下最基本的數(shù)據(jù)庫連接操作,此例子希望大家感受下最基本的數(shù)據(jù)庫連接操作,并對比兩種查詢結(jié)果獲取方法,當(dāng)然,你完全可以通過自定義SQL語法limit來實現(xiàn):
import mysql.connector
#連接數(shù)據(jù)庫
mydb = mysql.connector.connect(
host="localhost", # 數(shù)據(jù)庫主機地址
user="root", # 數(shù)據(jù)庫用戶名
passwd="root", # 數(shù)據(jù)庫密碼
database="dvwa" # 指定數(shù)據(jù)庫
)
mycursor = mydb.cursor() # 使用 cursor() 方法創(chuàng)建一個游標對象
mycursor.execute("SHOW TABLES")
myresult1 = mycursor.fetchall() # fetchall() 獲取所有記錄
print('fetchall()結(jié)果:{}'.format(myresult1))
mycursor.execute("SHOW TABLES")
myresult2 = mycursor.fetchone() # fetchone() 獲取單條記錄
print('fetchone()結(jié)果:{}'.format(myresult2))
# 關(guān)閉數(shù)據(jù)庫連接
mydb.close()
#輸出:
fetchall()結(jié)果:[('guestbook',), ('user',), ('users',)]
fetchone()結(jié)果:('guestbook',)
然后是數(shù)據(jù)庫基本插入操作,此處希望大家對比學(xué)習(xí)單句執(zhí)行和多句執(zhí)行的方法,并養(yǎng)成良好的代碼習(xí)慣:
import mysql.connector
#連接數(shù)據(jù)庫
mydb = mysql.connector.connect(
host="localhost", # 數(shù)據(jù)庫主機地址
user="root", # 數(shù)據(jù)庫用戶名
passwd="root", # 數(shù)據(jù)庫密碼
database="dvwa" # 指定數(shù)據(jù)庫
)
mycursor = mydb.cursor() # 使用 cursor() 方法創(chuàng)建一個游標對象
sql="INSERT INTO user (user,password) VALUES (%s, %s)"
val=[
('rabbit','rabbit'),
('carrot','carrot')
]
mycursor.executemany(sql, val) # executemany()方法執(zhí)行多條sql語句
mydb.commit() # 提交事務(wù),數(shù)據(jù)表內(nèi)容有更新,必須使用到該語句
mycursor.execute("select * from user") # execute()方法執(zhí)行單條sql語句
print("當(dāng)前表的內(nèi)容:")
for i in mycursor:
print(i)
# 關(guān)閉數(shù)據(jù)庫連接
mydb.close()
#輸出:
當(dāng)前表的內(nèi)容:
('rabbit', 'rabbit')
('carrot', 'carrot')
這里順便提一句,sql語法中關(guān)鍵詞是不區(qū)分大小寫的,而數(shù)據(jù)庫名表名之類的看情況。SQL Server是通過數(shù)據(jù)庫設(shè)置,來決定表名、字段名是否區(qū)分大小寫;MySQL是依賴于配置和操作系統(tǒng)來決定 ( Windows 不區(qū)分, Linux 區(qū)分)。
二、PyMySQL
同上,自行安裝PyMySQL:pip3 install PyMySQL
import pymysql
#連接數(shù)據(jù)庫
mydb = pymysql.connect(
host="localhost", # 數(shù)據(jù)庫主機地址
user="root", # 數(shù)據(jù)庫用戶名
passwd="root", # 數(shù)據(jù)庫密碼
database="dvwa" # 指定數(shù)據(jù)庫
)
mycursor = mydb.cursor() # 使用 cursor() 方法創(chuàng)建一個游標對象
sql="INSERT INTO user (user,password) VALUES (%s, %s)"
val=[
('rabbit','rabbit'),
('carrot','carrot')
]
mycursor.executemany(sql,val) # executemany()方法執(zhí)行多條sql語句
mydb.commit() # 提交事務(wù),數(shù)據(jù)表內(nèi)容有更新,必須使用到該語句
mycursor.execute("select * from user") # execute()方法執(zhí)行單條sql語句
print("當(dāng)前表的內(nèi)容:")
for i in mycursor:
print(i)
# 關(guān)閉數(shù)據(jù)庫連接
mydb.close()
#輸出:
當(dāng)前表的內(nèi)容:
('rabbit', 'rabbit')
('carrot', 'carrot')
有沒有感覺很眼熟= =,我糾結(jié)了兩天,他們兩個語法上有什么差異,原諒我百度Google了好久也沒找到特別完美的解釋,從專業(yè)開發(fā)那里得到的解釋是pymysql在工程較大時很容易引起并發(fā)問題,之前遇到過多線程頻繁讀寫數(shù)據(jù)庫出現(xiàn)的問題。至少目前看來未發(fā)現(xiàn)明顯語法差異,雖然強迫癥,但對于一個次選方案我們暫且擱置,歡迎大家積極討論留言!
三、mysqlclient
同上,自行安裝mysqlclientpip3 install mysqlclient
import MySQLdb
#連接數(shù)據(jù)庫
mydb = MySQLdb.connect(
host="localhost", # 數(shù)據(jù)庫主機地址
user="root", # 數(shù)據(jù)庫用戶名
passwd="root", # 數(shù)據(jù)庫密碼
database="dvwa" # 指定數(shù)據(jù)庫
)
mycursor = mydb.cursor() # 使用 cursor() 方法創(chuàng)建一個游標對象
sql="INSERT INTO user (user,password) VALUES (%s, %s)"
val=[
('rabbit','rabbit'),
('carrot','carrot')
]
mycursor.executemany(sql,val) # executemany()方法執(zhí)行多條sql語句
mydb.commit() # 提交事務(wù),數(shù)據(jù)表內(nèi)容有更新,必須使用到該語句
mycursor.execute("select * from user") # execute()方法執(zhí)行單條sql語句
print("當(dāng)前表的內(nèi)容:")
for i in mycursor:
print(i)
# 關(guān)閉數(shù)據(jù)庫連接
mydb.close()
#輸出:
當(dāng)前表的內(nèi)容:
('rabbit', 'rabbit')
('carrot', 'carrot')
寫道這里,老臉一黑,這讓我怎么講課,語法完全相同好不好!
這里補充兩點,在其他教程中你可能還會看到一個MySQL-python的叫法,MySQL-python即MySQLdb,剛剛我們說到了,它是對C語言操作MySQL數(shù)據(jù)庫的一個簡單封裝。遵循了Python DB API v2。但是只支持Python2,目前還不支持Python3。mysqlclient:是MySQL-python的另外一個分支。支持Python3并且修復(fù)了一些bug,你可以認為它就是python2中傳承給python3的原MySQLdb。
但是mysqlclient驅(qū)動的用法,依然是MySQLdb的用法,上面代碼例子也可以看出來,嘗試import mysqlclient是不存在的。
四、SQLAlchemy
sqlAlchemy是python中著名的ORM(Object Relationship Mapping,對象關(guān)系映射)框架。
在常見的web框架中均有涉及,它可以用來進行多種常見數(shù)據(jù)庫的操作。
作為入門篇這里簡單提一句,后邊會在使用時展開討論。
如果想要專業(yè)py開發(fā)詳解,請以@方式督促鳥群pyy大佬更文。
最后一句:本章節(jié)在數(shù)據(jù)庫的具體操作上講的不多,總感覺那一塊輸入SQL內(nèi)容,并不屬于python,故!嗯!