Python入門系列(九)——數(shù)據(jù)庫

鑒于是入門系列教程,我們在數(shù)據(jù)庫種類上且不做拓展,僅以MySQL為例。
目錄:
一、mysql-connector
二、PyMySQL
三、mysqlclient
四、SQLAlchemy

Python3下MySQL數(shù)據(jù)庫操作有有多種方法:首先是mysql-connectorPyMySQL,區(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-pythonMySQLdb,剛剛我們說到了,它是對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,故!嗯!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 環(huán)境管理管理Python版本和環(huán)境的工具。p–非常簡單的交互式python版本管理工具。pyenv–簡單的Pyth...
    MrHamster閱讀 3,955評論 1 61
  • 原作者:http://www.380y.com/p951.htm Chardet字符編碼探測器,可以自動檢測文本、...
    步_塵閱讀 7,345評論 1 13
  • 常用庫: fuzzywuzzy,字符串模糊匹配。 esmre,正則表達式的加速器。 Chardet字符編碼探測器,...
    AlastairYuan閱讀 2,409評論 0 43
  • 那天的風(fēng)很大,吹在身上有點冷,黑夜里的風(fēng)吹起了我的衣衫,吹散了我的發(fā)梢,也吹亂了我的思緒。我無法控制的、無法控制的...
    耘兒910閱讀 747評論 2 17
  • 經(jīng)常刷公眾號,看見了一篇關(guān)于理財?shù)慕榻B,講得特別激動,振奮人心,看一下到底有多大的魅力,自己給自己說肯定熬...
    天空_上閱讀 285評論 0 0

友情鏈接更多精彩內(nèi)容