Python連接和操作數(shù)據(jù)庫(kù)的流程步驟
更新時(shí)間:2024年10月23日 09:10:03 作者:傻啦嘿喲
是一種開(kāi)源的對(duì)象關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(ORDBMS),以其強(qiáng)大的功能和穩(wěn)定性而廣受歡迎,本文將詳細(xì)介紹如何使用Python連接和操作數(shù)據(jù)庫(kù),需要的朋友可以參考下
目錄
引言
在當(dāng)今信息化的時(shí)代,數(shù)據(jù)庫(kù)已成為存儲(chǔ)和管理數(shù)據(jù)的關(guān)鍵技術(shù)。 是一種開(kāi)源的對(duì)象關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(ORDBMS),以其強(qiáng)大的功能和穩(wěn)定性而廣受歡迎。Python 作為一種高級(jí)編程語(yǔ)言,因其簡(jiǎn)潔易讀的語(yǔ)法和豐富的庫(kù)支持,成為了數(shù)據(jù)處理和數(shù)據(jù)庫(kù)操作的理想選擇。本文將詳細(xì)介紹如何使用 Python 連接和操作 數(shù)據(jù)庫(kù),包括環(huán)境搭建、連接數(shù)據(jù)庫(kù)、執(zhí)行 SQL 查詢和更新操作,以及處理異常和事務(wù)管理等內(nèi)容。
環(huán)境搭建
在開(kāi)始之前,我們需要確保系統(tǒng)上已經(jīng)安裝了 數(shù)據(jù)庫(kù)和 Python 環(huán)境。以下是安裝步驟:
安裝 在 Windows 上安裝 在 Linux 上安裝
sudo apt-get update sudo apt-get install postgresql postgresql-contrib
在 macOS 上安裝
brew install postgresql
安裝 Python 和相關(guān)庫(kù)
確保系統(tǒng)上已經(jīng)安裝了 Python。然后使用 pip 安裝 庫(kù),這是一個(gè)用于連接 數(shù)據(jù)庫(kù)的 Python 擴(kuò)展模塊。
pip install psycopg2
連接數(shù)據(jù)庫(kù)
連接數(shù)據(jù)庫(kù)是進(jìn)行數(shù)據(jù)庫(kù)操作的第一步。以下是使用 Python 連接 數(shù)據(jù)庫(kù)的基本步驟:
導(dǎo)入庫(kù)
import psycopg2
建立連接
try:
conn = psycopg2.connect(
host="localhost",
database="mydatabase",
user="myuser",
password="mypassword"
)
print("成功連接到數(shù)據(jù)庫(kù)")
except psycopg2.Error as e:
print(f"連接數(shù)據(jù)庫(kù)失敗: {e}")
創(chuàng)建游標(biāo)
游標(biāo)用于執(zhí)行 SQL 查詢并獲取結(jié)果。
cur = conn.cursor()
執(zhí)行查詢
try:
cur.execute("SELECT version();")
db_version = cur.fetchone()
print(f"數(shù)據(jù)庫(kù)版本: {db_version[0]}")
except psycopg2.Error as e:
print(f"執(zhí)行查詢失敗: {e}")
關(guān)閉游標(biāo)和連接
cur.close() conn.close()
執(zhí)行 SQL 查詢和更新操作查詢數(shù)據(jù)
查詢數(shù)據(jù)是最常見(jiàn)的數(shù)據(jù)庫(kù)操作之一。以下是一個(gè)簡(jiǎn)單的查詢示例:
try:
cur.execute("SELECT * FROM mytable;")
rows = cur.fetchall()
for row in rows:
print(row)
except psycopg2.Error as e:
print(f"查詢失敗: {e}")
插入數(shù)據(jù)
插入數(shù)據(jù)用于向數(shù)據(jù)庫(kù)表中添加新記錄。
try:
cur.execute("INSERT INTO mytable (column1, column2) VALUES (%s, %s);", ("value1", "value2"))
conn.commit()
print("插入成功")
except psycopg2.Error as e:
print(f"插入失敗: {e}")
conn.rollback()
更新數(shù)據(jù)
更新數(shù)據(jù)用于修改數(shù)據(jù)庫(kù)表中的現(xiàn)有記錄。
try:
cur.execute("UPDATE mytable SET column1 = %s WHERE column2 = %s;", ("new_value1", "value2"))
conn.commit()
print("更新成功")
except psycopg2.Error as e:
print(f"更新失敗: {e}")
conn.rollback()
刪除數(shù)據(jù)
刪除數(shù)據(jù)用于從數(shù)據(jù)庫(kù)表中移除記錄。
try:
cur.execute("DELETE FROM mytable WHERE column1 = %s;", ("value1",))
conn.commit()
print("刪除成功")
except psycopg2.Error as e:
print(f"刪除失敗: {e}")
conn.rollback()
處理異常
在數(shù)據(jù)庫(kù)操作過(guò)程中,可能會(huì)遇到各種異常情況。為了確保程序的健壯性,我們需要捕獲并處理這些異常。
捕獲異常
try:
# 數(shù)據(jù)庫(kù)操作代碼
except psycopg2.Error as e:
print(f"數(shù)據(jù)庫(kù)操作失敗: {e}")
finally:
if conn is not None:
conn.close()
處理特定異常
有時(shí)我們需要處理特定類型的異常,例如連接異常或查詢異常。
try:
# 數(shù)據(jù)庫(kù)操作代碼
except psycopg2.OperationalError as e:
print(f"連接或操作錯(cuò)誤: {e}")
except psycopg2.ProgrammingError as e:
print(f"SQL 語(yǔ)句錯(cuò)誤: {e}")
事務(wù)管理
事務(wù)是一組數(shù)據(jù)庫(kù)操作,這些操作要么全部成功,要么全部失敗。事務(wù)管理對(duì)于確保數(shù)據(jù)的一致性和完整性至關(guān)重要。
開(kāi)啟事務(wù)
conn.autocommit = False
提交事務(wù)
try:
# 數(shù)據(jù)庫(kù)操作代碼
conn.commit()
print("事務(wù)提交成功")
except psycopg2.Error as e:
conn.rollback()
print(f"事務(wù)提交失敗: {e}")
回滾事務(wù)
try:
# 數(shù)據(jù)庫(kù)操作代碼
conn.commit()

except psycopg2.Error as e:
conn.rollback()
print(f"事務(wù)回滾: {e}")
使用上下文管理器
Python 的上下文管理器可以簡(jiǎn)化資源管理,特別是在處理數(shù)據(jù)庫(kù)連接和游標(biāo)時(shí)。
使用with語(yǔ)句管理連接
try:
with psycopg2.connect(
host="localhost",
database="mydatabase",
user="myuser",
password="mypassword"
) as conn:
with conn.cursor() as cur:
cur.execute("SELECT version();")
db_version = cur.fetchone()
print(f"數(shù)據(jù)庫(kù)版本: {db_version[0]}")
except psycopg2.Error as e:
print(f"連接或查詢失敗: {e}")
使用with語(yǔ)句管理事務(wù)
try:
with psycopg2.connect(
host="localhost",
database="mydatabase",
user="myuser",
password="mypassword"
) as conn:
conn.autocommit = False
with conn.cursor() as cur:
cur.execute("INSERT INTO mytable (column1, column2) VALUES (%s, %s);", ("value1", "value2"))
conn.commit()
print("插入成功")
except psycopg2.Error as e:
print(f"插入失敗: {e}")
高級(jí)功能使用參數(shù)化查詢
參數(shù)化查詢可以有效防止 SQL 注入攻擊,并提高查詢性能。
try:
with psycopg2.connect(
host="localhost",
database="mydatabase",
user="myuser",
password="mypassword"
) as conn:
with conn.cursor() as cur:
cur.execute("SELECT * FROM mytable WHERE column1 = %s;", ("value1",))
rows = cur.fetchall()
for row in rows:
print(row)
except psycopg2.Error as e:
print(f"查詢失敗: {e}")
使用批量操作
批量操作可以顯著提高數(shù)據(jù)插入和更新的性能。
try:
with psycopg2.connect(
host="localhost",
database="mydatabase",
user="myuser",
password="mypassword"
) as conn:
with conn.cursor() as cur:
data = [("value1", "value2"), ("value3", "value4")]
cur.executemany("INSERT INTO mytable (column1, column2) VALUES (%s, %s);", data)
conn.commit()
print("批量插入成功")
except psycopg2.Error as e:
print(f"批量插入失敗: {e}")
使用存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程是預(yù)編譯的 SQL 代碼塊,可以在數(shù)據(jù)庫(kù)中存儲(chǔ)并重復(fù)調(diào)用。
CREATE OR REPLACE FUNCTION get_user_by_id(user_id INT) RETURNS TABLE(id INT, name TEXT) AS $$
BEGIN
RETURN QUERY SELECT id, name FROM users WHERE id = user_id;
END;
$$ LANGUAGE plpgsql;
try:
with psycopg2.connect(
host="localhost",
database="mydatabase",
user="myuser",
password="mypassword"
) as conn:
with conn.cursor() as cur:
cur.callproc('get_user_by_id', [1])
rows = cur.fetchall()
for row in rows:
print(row)
except psycopg2.Error as e:
print(f"調(diào)用存儲(chǔ)過(guò)程失敗: {e}")
性能優(yōu)化使用連接池
連接池可以減少連接數(shù)據(jù)庫(kù)的開(kāi)銷,提高性能。
from psycopg2 import pool
try:
postgreSQL_pool = psycopg2.pool.SimpleConnectionPool(
1, 20,
host="localhost",
database="mydatabase",
user="myuser",
password="mypassword"
)
if postgreSQL_pool:
print("連接池創(chuàng)建成功")
except psycopg2.Error as e:
print(f"連接池創(chuàng)建失敗: {e}")
# 獲取連接
conn = postgreSQL_pool.getconn()
try:
with conn.cursor() as cur:
cur.execute("SELECT version();")
db_version = cur.fetchone()
print(f"數(shù)據(jù)庫(kù)版本: {db_version[0]}")
finally:
# 釋放連接
postgreSQL_pool.putconn(conn)
使用索引
索引可以顯著提高查詢性能,特別是在大數(shù)據(jù)集上。

CREATE INDEX idx_column1 ON mytable(column1);
使用批量提交
批量提交可以減少事務(wù)的開(kāi)銷,提高性能。
try:
with psycopg2.connect(
host="localhost",
database="mydatabase",
user="myuser",
password="mypassword"
) as conn:
conn.autocommit = False
with conn.cursor() as cur:
data = [("value1", "value2"), ("value3", "value4")]
for row in data:
cur.execute("INSERT INTO mytable (column1, column2) VALUES (%s, %s);", row)
if len(data) % 1000 == 0:
conn.commit()
print("批量提交成功")
conn.commit()
print("插入完成")
except psycopg2.Error as e:
print(f"插入失敗: {e}")
conn.rollback()
案例分析
為了更好地理解如何使用 Python 連接和操作 數(shù)據(jù)庫(kù),我們將通過(guò)一個(gè)實(shí)際案例來(lái)進(jìn)行演示。
案例背景
假設(shè)我們有一個(gè)簡(jiǎn)單的電子商務(wù)網(wǎng)站,需要管理用戶信息和訂單信息。我們將創(chuàng)建兩個(gè)表:users和orders,并演示如何進(jìn)行基本的增刪改查操作。
創(chuàng)建表
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL
);
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
amount DECIMAL(10, 2) NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id)
);
插入數(shù)據(jù)
try:
with psycopg2.connect(
host="localhost",
database="mydatabase",
user="myuser",
password="mypassword"
) as conn:
with conn.cursor() as cur:
users_data = [
("Alice", "alice@example.com"),
("Bob", "bob@example.com")
]
cur.executemany("INSERT INTO users (name, email) VALUES (%s, %s);", users_data)
conn.commit()
print("用戶數(shù)據(jù)插入成功")
orders_data = [
(1, 100.00),
(2, 200.00)
]
cur.executemany("INSERT INTO orders (user_id, amount) VALUES (%s, %s);", orders_data)
conn.commit()
print("訂單數(shù)據(jù)插入成功")
except psycopg2.Error as e:
print(f"數(shù)據(jù)插入失敗: {e}")
查詢數(shù)據(jù)
try:
with psycopg2.connect(
host="localhost",
database="mydatabase",
user="myuser",
password="mypassword"
) as conn:
with conn.cursor() as cur:
cur.execute("SELECT * FROM users;")
users = cur.fetchall()
print("用戶數(shù)據(jù):")
for user in users:
print(user)
cur.execute("SELECT * FROM orders;")
orders = cur.fetchall()
print("訂單數(shù)據(jù):")
for order in orders:
print(order)
except psycopg2.Error as e:
print(f"數(shù)據(jù)查詢失敗: {e}")
更新數(shù)據(jù)
try:
with psycopg2.connect(
host="localhost",
database="mydatabase",
user="myuser",
password="mypassword"
) as conn:
with conn.cursor() as cur:
cur.execute("UPDATE users SET email = %s WHERE name = %s;", ("alice_new@example.com", "Alice"))
conn.commit()
print("用戶數(shù)據(jù)更新成功")
except psycopg2.Error as e:
print(f"數(shù)據(jù)更新失敗: {e}")
刪除數(shù)據(jù)
try:
with psycopg2.connect(
host="localhost",
database="mydatabase",
user="myuser",
password="mypassword"
) as conn:
with conn.cursor() as cur:
cur.execute("DELETE FROM orders WHERE user_id = %s;", (1,))
conn.commit()
print("訂單數(shù)據(jù)刪除成功")
except psycopg2.Error as e:
print(f"數(shù)據(jù)刪除失敗: {e}")
結(jié)論
通過(guò)本文的詳細(xì)介紹,我們學(xué)習(xí)了如何使用 Python 連接和操作 數(shù)據(jù)庫(kù)。從環(huán)境搭建到高級(jí)功能的使用,再到性能優(yōu)化和實(shí)際案例的分析,我們涵蓋了數(shù)據(jù)庫(kù)操作的各個(gè)方面。希望本文能為新手朋友提供有價(jià)值的參考和指導(dǎo),幫助大家在 Python 和 的世界中探索更多的可能性。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。
1024成人网| 亚洲高清免费在线| av成人免费在线| 国产三区在线成人av| 国内精品写真在线观看| 中文字幕欧美国产| 色视频成人在线观看免| 亚洲成人一区二区| 欧美老肥妇做.爰bbww视频| 视频一区二区三区中文字幕| 制服丝袜国产精品| 日韩国产欧美在线观看| 成人黄色小视频| 国产亚洲午夜高清国产拍精品| 国产成人午夜电影网| 中文字幕成人在线观看| 在线亚洲高清视频| 精品一区二区三区免费| 亚洲黄色av一区| 日韩欧美中文字幕公布| 成人黄色电影在线| 亚洲福利视频导航| 久久久精品免费网站| 91丨porny丨最新| 男女性色大片免费观看一区二区 | 国产亚洲综合在线| 91在线观看高清| 免费的成人av| 亚洲欧美综合在线精品| 51精品秘密在线观看| 97久久久精品综合88久久| 亚洲一二三四久久| 国产欧美一区二区精品忘忧草| 日本精品视频一区二区| 成人网在线播放| 久久精品国产精品亚洲精品| 亚洲国产人成综合网站| 国产精品欧美经典| 欧美国产日韩亚洲一区| 欧美电影免费观看完整版| 欧美无乱码久久久免费午夜一区| 成人av在线播放网站| 国产一区二区三区电影在线观看| 日韩影院精彩在线| 首页国产欧美久久| 午夜欧美一区二区三区在线播放| 一区二区激情小说| 亚洲一区二区视频| 亚洲国产精品久久艾草纯爱| 亚洲一二三四在线| 日日骚欧美日韩| 亚洲在线免费播放| 亚洲精品乱码久久久久久黑人| 自拍av一区二区三区| 中文字幕一区二区三区不卡在线| 欧美激情一二三区| 日韩美女啊v在线免费观看| 最新国产の精品合集bt伙计| 亚洲欧洲日韩综合一区二区| 亚洲欧美日韩国产中文在线| 亚洲最大色网站| 午夜欧美电影在线观看| 日韩激情av在线| 捆绑调教美女网站视频一区| 激情久久五月天| 国产精品一级在线| 97久久精品人人做人人爽50路 | 在线观看欧美黄色| 一本大道av一区二区在线播放| 91论坛在线播放| 777a∨成人精品桃花网| 精品国产乱子伦一区| 国产精品午夜春色av| 亚洲一区二区三区爽爽爽爽爽 | 亚洲精品国产精品乱码不99| 一区二区三区国产| 奇米影视在线99精品| 国产不卡视频在线播放| 色国产精品一区在线观看| 4438x亚洲最大成人网| 欧美极品aⅴ影院| 午夜不卡av免费| 福利一区在线观看| 欧美欧美午夜aⅴ在线观看| 久久精品在线免费观看| 亚洲精品成人a在线观看| 久久66热re国产| 色综合久久久久| 精品久久久久99| 亚洲综合视频网| 国产成人精品免费| 欧美另类z0zxhd电影| 国产精品电影一区二区三区| 日韩电影网1区2区| 91欧美一区二区| 久久久久9999亚洲精品| 亚洲va国产天堂va久久en| 成人激情电影免费在线观看| 在线91免费看| 一区二区高清免费观看影视大全 | 午夜成人免费视频| www.性欧美| 欧美变态口味重另类| 亚洲国产中文字幕在线视频综合 | 午夜伊人狠狠久久| 国产成人在线视频免费播放| 7777精品久久久大香线蕉| 国产精品全国免费观看高清| 五月天视频一区| 99re成人精品视频| 精品国产免费久久| 久久精品国产亚洲aⅴ | 欧美体内she精高潮| 国产精品午夜在线| 国产一区二区看久久| 欧美疯狂做受xxxx富婆| 一区二区三区久久| 色婷婷综合久色| 17c精品麻豆一区二区免费| 国产精品一区二区视频| 欧美刺激午夜性久久久久久久| 亚洲精品国久久99热| 97久久超碰国产精品电影| 国产精品蜜臀在线观看| 国产aⅴ综合色| 国产欧美日韩视频在线观看| 精品亚洲国产成人av制服丝袜| 日韩一级视频免费观看在线| 男人的j进女人的j一区| 欧美不卡在线视频| 久久99精品久久久| 日韩视频免费观看高清完整版在线观看 | 日韩一区二区三区免费观看| 亚州成人在线电影| 欧洲国内综合视频| 午夜精品视频一区| 欧美一区二区精品久久911| 奇米精品一区二区三区在线观看 | 国产馆精品极品| 国产丝袜美腿一区二区三区| 国产精品91一区二区| 中文字幕高清一区| 色av一区二区| 免播放器亚洲一区| 精品电影一区二区| 国产精品一区二区无线| 一区精品在线播放| 欧美精品xxxxbbbb| 国产一区二三区好的| 国产日韩欧美亚洲| 色综合天天做天天爱| 亚洲成人精品在线观看| 日韩欧美在线1卡| 成人一级黄色片| 亚洲曰韩产成在线| 久久免费电影网| 91丨九色丨蝌蚪丨老版| 婷婷成人综合网| 在线看国产一区| 久久精品国产精品亚洲红杏| 国产欧美一二三区| 欧美亚洲国产一卡| 国产精品传媒在线| 日韩午夜激情av| 99久久精品国产一区二区三区 | 亚洲一区二区偷拍精品| 日韩欧美你懂的| 色婷婷av一区二区三区大白胸| 天堂成人国产精品一区| 国产日韩欧美不卡在线| 欧美午夜精品理论片a级按摩| 国产在线精品一区二区不卡了 | 国产精品久久久久影院| 在线看不卡av| 国产精品888| 蜜臀av一区二区在线观看| 1024精品合集| 久久久久久电影| 欧美一区二区精品在线| 欧美色区777第一页| 成人av免费在线播放| 久久精品国产99国产精品| 亚洲国产综合色| 亚洲日本一区二区三区| 中文字幕成人av| 欧美精品一区二区久久久| 日本精品裸体写真集在线观看 | 免费黄网站欧美| 亚洲一卡二卡三卡四卡无卡久久 | 久久久亚洲精品石原莉奈| 日本精品一区二区三区高清 | 成人的网站免费观看| 男人的j进女人的j一区| 亚洲国产精品久久人人爱| 国产精品国产三级国产| 国产精品视频一区二区三区不卡| 精品国产一区二区三区av性色| 在线播放亚洲一区| 91精品国产欧美一区二区成人| 欧美影院午夜播放|