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)系。
日本欧美韩国一区三区| 亚洲mv在线观看| 亚洲天堂网中文字| 另类小说欧美激情| 欧美日韩精品一区二区在线播放| 国产精品久久久久久久蜜臀| 日本欧美一区二区在线观看| 欧美久久久久久蜜桃| 亚洲成va人在线观看| 欧美日韩国产不卡| 蜜桃av一区二区在线观看| 欧美伦理视频网站| 美洲天堂一区二卡三卡四卡视频| 91精品国产一区二区三区蜜臀 | 成人毛片视频在线观看| 欧美国产一区在线| 日本精品一级二级| 亚洲一卡二卡三卡四卡五卡| 欧美一区二区三区四区视频| 毛片av一区二区| 日本一区二区三区视频视频| 99re在线精品| 日韩不卡手机在线v区| 久久色成人在线| 日本韩国精品在线| 国产综合一区二区| 亚洲人午夜精品天堂一二香蕉| 欧美在线综合视频| 激情文学综合丁香| 国产精品国产三级国产aⅴ入口 | 91麻豆视频网站| 亚洲成人7777| 久久久蜜桃精品| 欧美日韩精品系列| 成人国产精品免费观看动漫| 国产精品国产馆在线真实露脸| 欧美日韩在线观看一区二区| 国产在线国偷精品免费看| 一区二区在线看| 欧美一区二区三区白人| 成人美女在线视频| 美女视频黄a大片欧美| 亚洲人一二三区| 一区二区三区四区在线| 26uuu国产日韩综合| 欧美调教femdomvk| 波多野结衣在线aⅴ中文字幕不卡| 亚洲va欧美va人人爽| 一区二区三区中文在线观看| 久久久综合激的五月天| 欧美精品乱码久久久久久| 99久久精品国产导航| 国产一区二区三区四| 日韩精品欧美成人高清一区二区| 国产欧美精品区一区二区三区| 7777精品伊人久久久大香线蕉超级流畅 | 蜜臀av在线播放一区二区三区| 中文字幕一区二区日韩精品绯色| 欧美成人一区二区三区片免费| 欧美性大战久久久久久久蜜臀| 成人免费看的视频| 国产精品一区一区| 麻豆成人免费电影| 免费观看久久久4p| 亚洲图片欧美视频| 亚洲国产裸拍裸体视频在线观看乱了| 中文字幕第一区二区| 久久一留热品黄| 日韩一区国产二区欧美三区| 678五月天丁香亚洲综合网| 欧美日韩一级黄| 欧美日韩三级视频| 91精品在线免费观看| 7799精品视频| 欧美sm极限捆绑bd| 精品免费国产二区三区| 欧美亚洲日本国产| 8v天堂国产在线一区二区| 日韩亚洲欧美综合| 久久人人97超碰com| 国产欧美日韩麻豆91| 国产精品久久久久三级| 亚洲激情在线播放| 天天操天天干天天综合网| 日韩不卡手机在线v区| 成人免费电影视频| 精品视频一区三区九区| 26uuu国产电影一区二区| 一区二区中文字幕在线| 日韩国产欧美在线播放| 国产福利一区二区| 欧美三级日韩在线| 国产日韩欧美麻豆| 亚洲国产sm捆绑调教视频| 国产精品一区在线观看乱码| 在线视频亚洲一区| 中文字幕不卡在线| 日韩高清不卡在线| av电影一区二区| www久久精品| 亚洲国产一区在线观看| 国产福利一区二区三区视频在线 | 久久99国产精品久久| 国产中文字幕一区| 国产成+人+日韩+欧美+亚洲| 国精产品一区一区三区mba桃花| 国产精品99久久久久久久女警| 日韩国产欧美在线观看| 91亚洲精品久久久蜜桃| 成人app在线| 国产iv一区二区三区| 精品中文字幕一区二区小辣椒| 日本久久电影网| 欧美亚洲国产怡红院影院| 六月婷婷色综合| 国产美女在线精品| 国产精品影音先锋| 欧美成人a∨高清免费观看| 日韩天堂在线观看| 国产日韩欧美a| 18欧美亚洲精品| 性做久久久久久免费观看| 在线观看91精品国产入口| 日韩理论片中文av| 亚洲精品精品亚洲| 日韩av电影一区| 国模冰冰炮一区二区| 成人综合婷婷国产精品久久| 99免费精品在线观看| 国产日韩精品一区二区三区| 一区二区三区中文在线观看| 毛片基地黄久久久久久天堂| 99精品偷自拍| 制服丝袜亚洲播放| 国产精品三级电影| 成人开心网精品视频| 欧美性猛交xxxxxx富婆| 日韩欧美激情在线| 一区二区三区欧美激情| 麻豆精品国产91久久久久久| 色综合久久久网| 一区二区三区美女| 极品少妇xxxx偷拍精品少妇| 日本高清无吗v一区| 欧美一二三在线| 亚洲精品自拍动漫在线| 日本网站在线观看一区二区三区| 精品一区二区三区久久| 日本高清不卡视频| 国产精品久久毛片a| 石原莉奈一区二区三区在线观看 | 欧美午夜精品一区二区蜜桃| 欧美乱妇一区二区三区不卡视频| 国产欧美日本一区二区三区| 一区二区三区国产精华| 国产精品18久久久久久vr| 欧美日韩高清一区| 欧美一级片在线看| 国产盗摄精品一区二区三区在线| 欧美美女一区二区在线观看| 一区二区三区四区不卡视频| 国产.欧美.日韩| 久久在线观看免费| 欧洲另类一二三四区| 国产精品久久久久久久久久免费看 | 亚洲一区二区五区| 国产乱一区二区| 精品日韩一区二区三区免费视频| 亚洲天堂2016| 自拍偷拍亚洲综合| 日韩一级大片在线| 日本不卡视频一二三区| 欧美日韩一区国产| 成人免费在线播放视频| 国产精品一区二区免费不卡 | 99久久久国产精品免费蜜臀| 国产女人水真多18毛片18精品视频| 欧美肥妇bbw| www.欧美色图| 国产精品乱码一区二区三区软件| 丝袜美腿一区二区三区| 91片黄在线观看| 综合激情网...| 久久久亚洲午夜电影| 国产一区二区三区国产| 国产丝袜在线精品| 成人av动漫在线| 中文字幕佐山爱一区二区免费| 亚洲欧美日韩国产综合在线 | 国产精品欧美精品| 奇米精品一区二区三区四区| 91久久精品国产91性色tv| 国产三级精品视频| 国产另类ts人妖一区二区| 免费精品视频在线| 欧美一级专区免费大片| 福利一区在线观看| 亚洲精品五月天| 91精品国产手机| 在线免费观看一区|