溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python操作數(shù)據(jù)庫的案例分析

發(fā)布時(shí)間:2020-09-18 09:18:45 來源:億速云 閱讀:258 作者:小新 欄目:編程語言

這篇文章主要介紹Python操作數(shù)據(jù)庫的案例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

一、Python數(shù)據(jù)庫API

Python 需要為操作不同的數(shù)據(jù)庫使用不同的模塊,但基本都遵守 Python 制訂的 DB API 協(xié)議,目前該協(xié)議的最新版本是 2.0。

使用 Python DB API 2.0 操作數(shù)據(jù)庫的基本流程如下

調(diào)用 connect() 方法打開數(shù)據(jù)庫連接,該方法返回?cái)?shù)據(jù)庫連接對(duì)象。

通過數(shù)據(jù)庫連接對(duì)象打開游標(biāo)。

使用游標(biāo)執(zhí)行 SQL 語句(包括 DDL、DML、select 查詢語句等)。如果執(zhí)行的是查詢語句,則處理查詢數(shù)據(jù)。

關(guān)閉游標(biāo)。

關(guān)閉數(shù)據(jù)庫連接。

使用 Python DB API 2.0 操作數(shù)據(jù)庫的基本流程如圖

Python操作數(shù)據(jù)庫的案例分析

數(shù)據(jù)庫 API 的核心類

遵守 DB API 2.0 協(xié)議的數(shù)據(jù)庫模塊通常會(huì)提供一個(gè) connect() 函數(shù),該函數(shù)用于連接數(shù)據(jù)庫,并返回?cái)?shù)據(jù)庫連接對(duì)象。數(shù)據(jù)庫連接對(duì)象通常會(huì)具有如下方法和屬性:

cursor(factory=Cursor):打開游標(biāo)。

commit():提交事務(wù)。

rollback():回滾事務(wù)。

close():關(guān)閉數(shù)據(jù)庫連接。

isolation_level:返回或設(shè)置數(shù)據(jù)庫連接中事務(wù)的隔離級(jí)別。

in_transaction:判斷當(dāng)前是否處于事務(wù)中。

游標(biāo)對(duì)象通常會(huì)具有如下方法和屬性:

execute(sql[, parameters]):執(zhí)行 SQL 語句。parameters 參數(shù)用于為 SQL 語句中的參數(shù)指定值。

executemany(sql, seq_of_parameters):重復(fù)執(zhí)行 SQL 語句??梢酝ㄟ^ seq_of_parameters 序列為 SQL 語句中的參數(shù)指定值,該序列有多少個(gè)元素,SQL 語句被執(zhí)行多少次。

fetchone():獲取查詢結(jié)果集的下一行。如果沒有下一行,則返回 None。

fetchmany(size=cursor.arraysize):返回查詢結(jié)果集的下 N 行組成的列表。如果沒有更多的數(shù)據(jù)行,則返回空列表。

fetchall():返回查詢結(jié)果集的全部行組成的列表。

close():關(guān)閉游標(biāo)。

rowcount:該只讀屬性返回受 SQL 語句影響的行數(shù)。對(duì)于 executemany() 方法,該方法所修改的記錄條數(shù)也可通過該屬性獲取。

lastrowid:該只讀屬性可獲取最后修改行的 rowid。

arraysize:用于設(shè)置或獲取 fetchmany() 默認(rèn)獲取的記錄條數(shù),該屬性默認(rèn)為 1。有些數(shù)據(jù)庫模塊沒有該屬性。

description:該只讀屬性可獲取最后一次查詢返回的所有列的列名信息。

connection:該只讀屬性返回創(chuàng)建游標(biāo)的數(shù)據(jù)庫連接對(duì)象。有些數(shù)據(jù)庫模塊沒有該屬性。

二、Python操作數(shù)據(jù)庫SQLite

SQLite是一種嵌入式數(shù)據(jù)庫,它的數(shù)據(jù)庫就是一個(gè)文件。

Python內(nèi)置了SQLite3,在Python中使用SQLite,不需要安裝任何東西,直接使用。

# 導(dǎo)入訪問SQLite的模塊
import sqlite3
# ①、打開或創(chuàng)建數(shù)據(jù)庫
# 也可以使用特殊名::memory:代表創(chuàng)建內(nèi)存中的數(shù)據(jù)庫
conn = sqlite3.connect('first.db')
# ②、獲取游標(biāo)
c = conn.cursor()
# ③、執(zhí)行DDL語句創(chuàng)建數(shù)據(jù)表
c.execute('''create table user_tb(
    _id integer primary key autoincrement,
    name text,
    pass text,
    gender text)''')
# 執(zhí)行DDL語句創(chuàng)建數(shù)據(jù)表
c.execute('''create table order_tb(
    _id integer primary key autoincrement,
    item_name text,
    item_price real,
    item_number real,
    user_id inteter,
    foreign key(user_id) references user_tb(_id) )''')
# 執(zhí)行DML的insert語句插入數(shù)據(jù)
c.execute('insert into user_tb values(null, ?, ?, ?)',
    ('孫悟空', '123456', 'male'))
c.execute('insert into order_tb values(null, ?, ?, ?, ?)',
    ('鼠標(biāo)', '34.2', '3', 1))
# SQLite 數(shù)據(jù)庫 API 默認(rèn)是開啟了事務(wù),需要提交事務(wù)
conn.commit()
# 調(diào)用executemany()方法把同一條SQL語句執(zhí)行多次
c.executemany('insert into user_tb values(null, ?, ?, ?)',
    (('sun', '123456', 'male'),
    ('bai', '123456', 'female'),
    ('zhu', '123456', 'male'),
    ('niu', '123456', 'male'),
    ('tang', '123456', 'male')))
# 通過rowcount獲取被修改的記錄條數(shù)
print('修改的記錄條數(shù):', c.rowcount)
conn.commit()
# ④、關(guān)閉游標(biāo)
c.close()
# ⑤、關(guān)閉連接
conn.close()

三、Python操作數(shù)據(jù)庫MySQL

安裝MySQL驅(qū)動(dòng)

由于MySQL服務(wù)器以獨(dú)立的進(jìn)程運(yùn)行,并通過網(wǎng)絡(luò)對(duì)外服務(wù),所以需要支持Python的MySQL驅(qū)動(dòng)來連接MySQL服務(wù)器。

MySQL官方提供了mysql-connector-python驅(qū)動(dòng),但是安裝的時(shí)候需要給pip命令加上參數(shù)--allow-external:

$ pip install mysql-connector-python --allow-external mysql-connector-python

我們演示如何連接到MySQL服務(wù)器的test數(shù)據(jù)庫:

# 導(dǎo)入訪問MySQL的模塊
import mysql.connector
# ①、連接數(shù)據(jù)庫
conn = conn = mysql.connector.connect(user='root', password='123456',
    host='localhost', port='3306',
    database='python', use_unicode=True)
# ②、獲取游標(biāo)
c = conn.cursor()
# ③、執(zhí)行DDL語句創(chuàng)建數(shù)據(jù)表
c.execute('''create table user_tb(
    user_id int primary key auto_increment,
    name varchar(255),
    pass varchar(255),
    gender varchar(255))''')
# 執(zhí)行DDL語句創(chuàng)建數(shù)據(jù)表
c.execute('''create table order_tb(
    order_id integer primary key auto_increment,
    item_name varchar(255),
    item_price double,
    item_number double,
    user_id int,
    foreign key(user_id) references user_tb(user_id) )''')
# 執(zhí)行DML的insert語句插入數(shù)據(jù)
c.execute('insert into user_tb values(null, %s, %s, %s)',
    ('孫悟空', '123456', 'male'))
c.execute('insert into order_tb values(null, %s, %s, %s, %s)',
    ('鼠標(biāo)', '34.2', '3', 1))
# 調(diào)用executemany()方法把同一條SQL語句執(zhí)行多次
c.executemany('insert into user_tb values(null, %s, %s, %s)',
    (('sun', '123456', 'male'),
    ('bai', '123456', 'female'),
    ('zhu', '123456', 'male'),
    ('niu', '123456', 'male'),
    ('tang', '123456', 'male')))
# 關(guān)閉事務(wù)支持conn.autocommit = True
conn.commit()
# ④、關(guān)閉游標(biāo)
c.close()
# ⑤、關(guān)閉連接
conn.close()

與連接 SQLite 相比,最大的區(qū)別在于第 5 行代碼,程序要連接 localhost 主機(jī)上 3306 端口服務(wù)的 python 數(shù)據(jù)庫。

與連接 SQLite 相比,MySQL 語句中的占位符:%s

MySQL 數(shù)據(jù)庫模塊的連接對(duì)象有一個(gè) autoconunit 屬性,如果將該屬性設(shè)為 True,則意味著關(guān)閉該連接的事務(wù)支持,程序每次執(zhí)行 DML 語句之后都會(huì)自動(dòng)提交,這樣程序就無須調(diào)用連接對(duì)象的 commit() 方法來提交事務(wù)了。

以上是Python操作數(shù)據(jù)庫的案例分析的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI