成人久久电影_日韩在线|中文_一区二区免费_国产91网站在线观看免费

整合營(yíng)銷服務(wù)商

電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

免費(fèi)咨詢熱線:

Python連接和操作PostgreSQL數(shù)據(jù)庫(kù)的流程步驟

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()

psql連接數(shù)據(jù)庫(kù)_pg數(shù)據(jù)庫(kù)連接命令_c連接postgresql數(shù)據(jù)庫(kù)

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ù)集上。

pg數(shù)據(jù)庫(kù)連接命令_c連接postgresql數(shù)據(jù)庫(kù)_psql連接數(shù)據(jù)庫(kù)

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 和 的世界中探索更多的可能性。


成人久久电影_日韩在线|中文_一区二区免费_国产91网站在线观看免费

          9000px;">

                  日本欧美韩国一区三区| 亚洲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精品国产手机| 在线免费观看一区|