Python中數(shù)據(jù)庫(kù)操作庫(kù)實(shí)戰(zhàn)示例
在Python開(kāi)發(fā)中,數(shù)據(jù)庫(kù)操作是高頻需求,無(wú)論是Web開(kāi)發(fā)、數(shù)據(jù)分析、自動(dòng)化測(cè)試,還是后臺(tái)服務(wù),都需要通過(guò)代碼與數(shù)據(jù)庫(kù)交互(增刪改查、連接管理等)。Python生態(tài)中提供了豐富的數(shù)據(jù)庫(kù)操作庫(kù),不同庫(kù)適配不同數(shù)據(jù)庫(kù)類(lèi)型、場(chǎng)景需求,各有優(yōu)劣。
本文將詳細(xì)介紹Python中最主流、最實(shí)用的數(shù)據(jù)庫(kù)操作庫(kù),涵蓋關(guān)系型數(shù)據(jù)庫(kù)(MySQL、PostgreSQL、SQLite)和非關(guān)系型數(shù)據(jù)庫(kù)(MongoDB、Redis)對(duì)應(yīng)的操作庫(kù),每個(gè)庫(kù)均包含「庫(kù)介紹→安裝步驟→核心用法→實(shí)戰(zhàn)示例→注意事項(xiàng)」,兼顧初學(xué)者入門(mén)和開(kāi)發(fā)者實(shí)戰(zhàn)復(fù)用,全程貼合Markdown排版,結(jié)構(gòu)清晰、內(nèi)容詳實(shí)。
注:所有示例均基于Python 3.8+版本,代碼可直接復(fù)制運(yùn)行(需提前安裝對(duì)應(yīng)庫(kù)、配置數(shù)據(jù)庫(kù)環(huán)境);重點(diǎn)講解“通用操作邏輯”,避免冗余,同時(shí)補(bǔ)充生產(chǎn)環(huán)境必備的異常處理、連接池等技巧。
一、前言:Python數(shù)據(jù)庫(kù)操作的核心邏輯
無(wú)論使用哪種數(shù)據(jù)庫(kù)、哪個(gè)操作庫(kù),Python與數(shù)據(jù)庫(kù)交互的核心邏輯一致,可概括為4步,統(tǒng)一梳理如下,后續(xù)所有庫(kù)的示例均遵循此邏輯:
- 連接數(shù)據(jù)庫(kù):通過(guò)庫(kù)提供的API,傳入數(shù)據(jù)庫(kù)地址、端口、用戶(hù)名、密碼、數(shù)據(jù)庫(kù)名等參數(shù),建立與數(shù)據(jù)庫(kù)的連接(關(guān)鍵:連接需及時(shí)關(guān)閉,避免資源泄露);
- 創(chuàng)建操作對(duì)象:通過(guò)連接對(duì)象,創(chuàng)建游標(biāo)(cursor)或會(huì)話(huà)(session),用于執(zhí)行SQL語(yǔ)句或數(shù)據(jù)庫(kù)命令;
- 執(zhí)行操作:通過(guò)操作對(duì)象執(zhí)行增刪改查、建表等操作,獲取執(zhí)行結(jié)果(查詢(xún)操作返回?cái)?shù)據(jù),增刪改返回影響行數(shù));
- 關(guān)閉資源:操作完成后,先關(guān)閉操作對(duì)象(游標(biāo)/會(huì)話(huà)),再關(guān)閉數(shù)據(jù)庫(kù)連接,順序不可顛倒。
補(bǔ)充:生產(chǎn)環(huán)境中,不建議頻繁創(chuàng)建/關(guān)閉連接(耗時(shí)且耗資源),優(yōu)先使用「連接池」管理連接;同時(shí)需添加異常處理,避免因數(shù)據(jù)庫(kù)異常(如連接失敗、SQL錯(cuò)誤)導(dǎo)致程序崩潰。
二、關(guān)系型數(shù)據(jù)庫(kù)操作庫(kù)(重點(diǎn))
關(guān)系型數(shù)據(jù)庫(kù)(MySQL、PostgreSQL、SQLite)是最常用的數(shù)據(jù)庫(kù)類(lèi)型,特點(diǎn)是數(shù)據(jù)結(jié)構(gòu)化、支持SQL語(yǔ)句、事務(wù)安全。Python中對(duì)應(yīng)操作庫(kù)均遵循“連接→操作→關(guān)閉”的邏輯,以下重點(diǎn)講解3個(gè)主流庫(kù)。
1. MySQLdb / PyMySQL(適配MySQL數(shù)據(jù)庫(kù))
MySQL是Python開(kāi)發(fā)中最常用的關(guān)系型數(shù)據(jù)庫(kù),對(duì)應(yīng)的操作庫(kù)有兩個(gè):MySQLdb 和 PyMySQL,兩者功能一致、用法幾乎相同,核心區(qū)別在于:MySQLdb僅支持Python 2.x,且僅支持Windows系統(tǒng);PyMySQL支持Python 3.x,跨平臺(tái)(Windows、Linux、Mac),是目前的首選。
本文重點(diǎn)講解 PyMySQL(主流、通用),替代過(guò)時(shí)的MySQLdb。
(1)庫(kù)介紹
- 定位:純Python編寫(xiě)的MySQL客戶(hù)端庫(kù),無(wú)需依賴(lài)C語(yǔ)言擴(kuò)展,安裝簡(jiǎn)單、跨平臺(tái);
- 核心功能:支持MySQL 5.5+版本,實(shí)現(xiàn)MySQL所有核心操作(增刪改查、事務(wù)、存儲(chǔ)過(guò)程、批量操作等);
- 優(yōu)勢(shì):輕量、易用、兼容性好,與MySQLdb API完全兼容,可無(wú)縫替換;
- 劣勢(shì):執(zhí)行效率略低于依賴(lài)C擴(kuò)展的庫(kù)(如mysql-connector-python),但足以滿(mǎn)足絕大多數(shù)場(chǎng)景。
(2)安裝步驟
使用pip命令安裝,直接執(zhí)行以下命令(無(wú)需額外依賴(lài)):
# 安裝PyMySQL(推薦) pip install pymysql # 若需安裝MySQLdb(僅Python 2.x,不推薦) # pip install mysqldb
(3)核心用法與實(shí)戰(zhàn)示例
示例場(chǎng)景:連接本地MySQL數(shù)據(jù)庫(kù)(數(shù)據(jù)庫(kù)名:test_db,用戶(hù)名:root,密碼:123456),實(shí)現(xiàn)「建表→插入數(shù)據(jù)→查詢(xún)數(shù)據(jù)→更新數(shù)據(jù)→刪除數(shù)據(jù)」的完整操作,包含異常處理和連接關(guān)閉。
import pymysql
from pymysql import Error
def mysql_demo():
# 1. 數(shù)據(jù)庫(kù)連接參數(shù)(根據(jù)實(shí)際環(huán)境修改)
db_config = {
"host": "localhost", # 數(shù)據(jù)庫(kù)地址(本地為localhost)
"port": 3306, # 數(shù)據(jù)庫(kù)端口(MySQL默認(rèn)3306)
"user": "root", # 用戶(hù)名
"password": "123456", # 密碼
"database": "test_db" # 要連接的數(shù)據(jù)庫(kù)名
}
# 初始化連接和游標(biāo)
connection = None
cursor = None
try:
# 2. 建立數(shù)據(jù)庫(kù)連接
connection = pymysql.connect(**db_config)
if connection.open:
print("? 成功連接到MySQL數(shù)據(jù)庫(kù)")
# 3. 創(chuàng)建游標(biāo)對(duì)象(用于執(zhí)行SQL語(yǔ)句)
cursor = connection.cursor()
# 4. 執(zhí)行操作(建表→插入→查詢(xún)→更新→刪除)
# 4.1 建表(若表不存在)
create_table_sql = """
CREATE TABLE IF NOT EXISTS user_info (
id INT AUTO_INCREMENT PRIMARY KEY, # 自增主鍵
name VARCHAR(50) NOT NULL, # 姓名(非空)
age INT, # 年齡
gender VARCHAR(10), # 性別
create_time DATETIME DEFAULT CURRENT_TIMESTAMP # 創(chuàng)建時(shí)間(默認(rèn)當(dāng)前時(shí)間)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
"""
cursor.execute(create_table_sql)
print("? 表創(chuàng)建成功(若不存在)")
# 4.2 插入數(shù)據(jù)(單條插入)
insert_sql = "INSERT INTO user_info (name, age, gender) VALUES (%s, %s, %s)"
insert_data = ("張三", 25, "男") # 占位符%s,避免SQL注入(重點(diǎn)?。?
cursor.execute(insert_sql, insert_data)
connection.commit() # 插入/更新/刪除操作需提交事務(wù)
print(f"? 插入數(shù)據(jù)成功,影響行數(shù):{cursor.rowcount}")
# 4.3 批量插入數(shù)據(jù)(效率高于單條插入)
batch_insert_sql = "INSERT INTO user_info (name, age, gender) VALUES (%s, %s, %s)"
batch_data = [("李四", 28, "男"), ("王五", 23, "女"), ("趙六", 30, "男")]
cursor.executemany(batch_insert_sql, batch_data)
connection.commit()
print(f"? 批量插入數(shù)據(jù)成功,影響行數(shù):{cursor.rowcount}")
# 4.4 查詢(xún)數(shù)據(jù)(單條查詢(xún)+多條查詢(xún))
# 單條查詢(xún)(根據(jù)id查詢(xún))
select_one_sql = "SELECT * FROM user_info WHERE id = %s"
cursor.execute(select_one_sql, (1,)) # 注意:參數(shù)需是元組,即使只有一個(gè)值
result_one = cursor.fetchone() # 獲取單條結(jié)果(返回元組,無(wú)結(jié)果返回None)
print(f"? 單條查詢(xún)結(jié)果:{result_one}")
# 多條查詢(xún)(查詢(xún)所有數(shù)據(jù))
select_all_sql = "SELECT * FROM user_info"
cursor.execute(select_all_sql)
result_all = cursor.fetchall() # 獲取所有結(jié)果(返回列表,每個(gè)元素是元組)
print(f"? 所有查詢(xún)結(jié)果(共{len(result_all)}條):")
for row in result_all:
print(f"id: {row[0]}, 姓名: {row[1]}, 年齡: {row[2]}, 性別: {row[3]}, 創(chuàng)建時(shí)間: {row[4]}")
# 4.5 更新數(shù)據(jù)
update_sql = "UPDATE user_info SET age = %s WHERE name = %s"
update_data = (26, "張三")
cursor.execute(update_sql, update_data)
connection.commit()
print(f"? 更新數(shù)據(jù)成功,影響行數(shù):{cursor.rowcount}")
# 4.6 刪除數(shù)據(jù)
delete_sql = "DELETE FROM user_info WHERE name = %s"
delete_data = ("趙六",)
cursor.execute(delete_sql, delete_data)
connection.commit()
print(f"? 刪除數(shù)據(jù)成功,影響行數(shù):{cursor.rowcount}")
except Error as e:
# 異常處理(捕獲連接、SQL執(zhí)行等異常)
print(f"? 數(shù)據(jù)庫(kù)操作異常:{e}")
# 若有事務(wù)未提交,回滾(避免數(shù)據(jù)錯(cuò)亂)
if connection:
connection.rollback()
finally:
# 5. 關(guān)閉資源(先關(guān)游標(biāo),再關(guān)連接,順序不可顛倒)
if cursor:
cursor.close()
print("? 游標(biāo)已關(guān)閉")
if connection and connection.open:
connection.close()
print("? 數(shù)據(jù)庫(kù)連接已關(guān)閉")
# 執(zhí)行示例
if __name__ == "__main__":
mysql_demo()(4)關(guān)鍵注意事項(xiàng)
- 避免SQL注入:必須使用占位符
%s傳遞參數(shù),不可直接拼接SQL字符串(如"INSERT INTO user_info VALUES ('" + name + "')"),否則會(huì)導(dǎo)致SQL注入漏洞; - 事務(wù)管理:插入、更新、刪除操作必須執(zhí)行
connection.commit()提交事務(wù),異常時(shí)需執(zhí)行connection.rollback()回滾,避免數(shù)據(jù)錯(cuò)亂; - 連接關(guān)閉:務(wù)必在finally塊中關(guān)閉游標(biāo)和連接,確保即使出現(xiàn)異常,資源也能正常釋放;
- 編碼設(shè)置:創(chuàng)建表時(shí)指定
CHARSET=utf8mb4,支持中文和特殊字符(如emoji),避免中文亂碼; - 連接池優(yōu)化:生產(chǎn)環(huán)境中,頻繁創(chuàng)建/關(guān)閉連接會(huì)影響效率,可使用
DBUtils庫(kù)實(shí)現(xiàn)連接池(后續(xù)補(bǔ)充)。
2. sqlite3(適配SQLite數(shù)據(jù)庫(kù),Python內(nèi)置)
SQLite是一款「輕量級(jí)嵌入式關(guān)系型數(shù)據(jù)庫(kù)」,無(wú)需單獨(dú)安裝數(shù)據(jù)庫(kù)服務(wù),數(shù)據(jù)存儲(chǔ)在單個(gè)文件中,適合小型項(xiàng)目、本地測(cè)試、嵌入式開(kāi)發(fā)等場(chǎng)景。Python內(nèi)置 sqlite3 庫(kù),無(wú)需額外安裝,可直接使用。
(1)庫(kù)介紹
- 定位:Python標(biāo)準(zhǔn)庫(kù)(3.0+版本內(nèi)置),無(wú)需安裝,開(kāi)箱即用;
- 核心功能:支持SQLite所有核心操作,適配SQLite 3.x版本,支持事務(wù)、觸發(fā)器、視圖等;
- 優(yōu)勢(shì):輕量、無(wú)需部署、零配置、跨平臺(tái),單個(gè)數(shù)據(jù)庫(kù)文件可直接遷移;
- 劣勢(shì):不適合高并發(fā)、大數(shù)據(jù)量場(chǎng)景(性能有限),不支持多線程同時(shí)寫(xiě)入。
(2)安裝步驟
無(wú)需安裝!Python 3.0+版本默認(rèn)內(nèi)置,直接導(dǎo)入 sqlite3 即可使用。
(3)核心用法與實(shí)戰(zhàn)示例
示例場(chǎng)景:創(chuàng)建本地SQLite數(shù)據(jù)庫(kù)文件(test_sqlite.db),實(shí)現(xiàn)「建表→插入→查詢(xún)→更新→刪除」完整操作,貼合SQLite輕量特性,補(bǔ)充異常處理。
import sqlite3
from sqlite3 import Error
def sqlite_demo():
# 1. 數(shù)據(jù)庫(kù)連接參數(shù)(SQLite無(wú)需用戶(hù)名密碼,僅需指定數(shù)據(jù)庫(kù)文件路徑)
db_path = "test_sqlite.db" # 數(shù)據(jù)庫(kù)文件存儲(chǔ)路徑(不存在則自動(dòng)創(chuàng)建)
# 初始化連接和游標(biāo)
connection = None
cursor = None
try:
# 2. 建立數(shù)據(jù)庫(kù)連接(SQLite連接是文件連接,不存在則創(chuàng)建文件)
connection = sqlite3.connect(db_path)
print("? 成功連接到SQLite數(shù)據(jù)庫(kù)(文件:test_sqlite.db)")
# 3. 創(chuàng)建游標(biāo)對(duì)象
cursor = connection.cursor()
# 4. 執(zhí)行操作(建表→插入→查詢(xún)→更新→刪除)
# 4.1 建表(若表不存在)
create_table_sql = """
CREATE TABLE IF NOT EXISTS book_info (
id INTEGER PRIMARY KEY AUTOINCREMENT, # SQLite自增用INTEGER,而非INT
book_name TEXT NOT NULL, # 書(shū)名(非空)
author TEXT, # 作者
price REAL, # 價(jià)格(浮點(diǎn)型)
publish_time TEXT # 出版時(shí)間(字符串格式)
);
"""
cursor.execute(create_table_sql)
print("? 表創(chuàng)建成功(若不存在)")
# 4.2 插入數(shù)據(jù)(單條+批量)
# 單條插入
insert_sql = "INSERT INTO book_info (book_name, author, price, publish_time) VALUES (?, ?, ?, ?)"
# SQLite占位符用?,而非%s,注意區(qū)別!
insert_data = ("Python編程:從入門(mén)到精通", "張三", 89.9, "2023-01-01")
cursor.execute(insert_sql, insert_data)
# 批量插入
batch_data = [
("Java編程思想", "李四", 99.9, "2022-05-01"),
("SQL必知必會(huì)", "王五", 59.9, "2023-03-15"),
("Redis實(shí)戰(zhàn)", "趙六", 79.9, "2023-06-20")
]
cursor.executemany(insert_sql, batch_data)
connection.commit() # SQLite同樣需要提交事務(wù)
print(f"? 插入數(shù)據(jù)成功,影響行數(shù):{cursor.rowcount}")
# 4.3 查詢(xún)數(shù)據(jù)
# 單條查詢(xún)(根據(jù)id)
select_one_sql = "SELECT * FROM book_info WHERE id = ?"
cursor.execute(select_one_sql, (1,))
result_one = cursor.fetchone()
print(f"? 單條查詢(xún)結(jié)果:{result_one}")
# 多條查詢(xún)(查詢(xún)價(jià)格>60的書(shū)籍)
select_condition_sql = "SELECT book_name, author, price FROM book_info WHERE price > ?"
cursor.execute(select_condition_sql, (60,))
result_condition = cursor.fetchall()
print(f"? 價(jià)格>60的書(shū)籍(共{len(result_condition)}條):")
for row in result_condition:
print(f"書(shū)名: {row[0]}, 作者: {row[1]}, 價(jià)格: {row[2]}元")
# 4.4 更新數(shù)據(jù)
update_sql = "UPDATE book_info SET price = ? WHERE book_name = ?"
update_data = (79.9, "Python編程:從入門(mén)到精通")
cursor.execute(update_sql, update_data)
connection.commit()
print(f"? 更新數(shù)據(jù)成功,影響行數(shù):{cursor.rowcount}")
# 4.5 刪除數(shù)據(jù)
delete_sql = "DELETE FROM book_info WHERE author = ?"
delete_data = ("趙六",)
cursor.execute(delete_sql, delete_data)
connection.commit()
print(f"? 刪除數(shù)據(jù)成功,影響行數(shù):{cursor.rowcount}")
except Error as e:
print(f"? 數(shù)據(jù)庫(kù)操作異常:{e}")
if connection:
connection.rollback()
finally:
# 關(guān)閉資源
if cursor:
cursor.close()
print("? 游標(biāo)已關(guān)閉")
if connection:
connection.close()
print("? 數(shù)據(jù)庫(kù)連接已關(guān)閉")
# 執(zhí)行示例
if __name__ == "__main__":
sqlite_demo()(4)關(guān)鍵注意事項(xiàng)
- 占位符差異:SQLite的占位符是
?,而非PyMySQL的%s,這是最容易出錯(cuò)的點(diǎn),務(wù)必注意; - 自增字段:SQLite的自增字段需定義為
INTEGER PRIMARY KEY AUTOINCREMENT,而非MySQL的INT AUTO_INCREMENT; - 數(shù)據(jù)類(lèi)型:SQLite支持的數(shù)據(jù)類(lèi)型較少,常用
TEXT(字符串)、INTEGER(整數(shù))、REAL(浮點(diǎn)),無(wú)需嚴(yán)格匹配類(lèi)型(如字符串可存入整數(shù)); - 并發(fā)限制:SQLite不支持多線程同時(shí)寫(xiě)入,高并發(fā)場(chǎng)景需避免使用,優(yōu)先選擇MySQL;
- 文件路徑:若指定的數(shù)據(jù)庫(kù)文件路徑不存在,SQLite會(huì)自動(dòng)創(chuàng)建該文件(無(wú)需手動(dòng)創(chuàng)建),推薦使用絕對(duì)路徑,避免路徑錯(cuò)亂。
3. psycopg2(適配PostgreSQL數(shù)據(jù)庫(kù))
PostgreSQL是一款功能強(qiáng)大、開(kāi)源免費(fèi)的關(guān)系型數(shù)據(jù)庫(kù),支持復(fù)雜查詢(xún)、JSON數(shù)據(jù)類(lèi)型、事務(wù)安全,適合中大型項(xiàng)目、數(shù)據(jù)分析場(chǎng)景。Python中操作PostgreSQL的主流庫(kù)是 psycopg2(依賴(lài)C擴(kuò)展,效率高)和 psycopg2-binary(二進(jìn)制版本,安裝簡(jiǎn)單,無(wú)需編譯)。
(1)庫(kù)介紹
- 定位:PostgreSQL官方推薦的Python客戶(hù)端庫(kù),功能完整、執(zhí)行效率高;
- 核心功能:支持PostgreSQL所有特性(復(fù)雜查詢(xún)、JSON、事務(wù)、存儲(chǔ)過(guò)程、批量操作等),適配PostgreSQL 9.0+版本;
- 優(yōu)勢(shì):效率高、兼容性好,支持異步操作(psycopg2-async),適合中大型項(xiàng)目;
- 劣勢(shì):安裝時(shí)需依賴(lài)PostgreSQL的開(kāi)發(fā)環(huán)境(編譯版本),推薦使用二進(jìn)制版本
psycopg2-binary簡(jiǎn)化安裝。
(2)安裝步驟
推薦安裝二進(jìn)制版本(無(wú)需編譯,跨平臺(tái)),執(zhí)行以下命令:
# 安裝psycopg2二進(jìn)制版本(推薦) pip install psycopg2-binary # 安裝編譯版本(需提前安裝PostgreSQL開(kāi)發(fā)環(huán)境,不推薦) # pip install psycopg2
(3)核心用法與實(shí)戰(zhàn)示例
示例場(chǎng)景:連接本地PostgreSQL數(shù)據(jù)庫(kù)(數(shù)據(jù)庫(kù)名:test_pg,用戶(hù)名:postgres,密碼:123456),實(shí)現(xiàn)核心操作,用法與PyMySQL類(lèi)似,重點(diǎn)突出差異點(diǎn)。
import psycopg2
from psycopg2 import Error
def postgresql_demo():
# 1. 數(shù)據(jù)庫(kù)連接參數(shù)
db_config = {
"host": "localhost",
"port": 5432, # PostgreSQL默認(rèn)端口5432(區(qū)別于MySQL的3306)
"user": "postgres", # PostgreSQL默認(rèn)用戶(hù)名postgres
"password": "123456",
"database": "test_pg"
}
connection = None
cursor = None
try:
# 2. 建立連接
connection = psycopg2.connect(**db_config)
cursor = connection.cursor()
print("? 成功連接到PostgreSQL數(shù)據(jù)庫(kù)")
# 3. 建表(支持JSON類(lèi)型,PostgreSQL特色)
create_table_sql = """
CREATE TABLE IF NOT EXISTS student_info (
id SERIAL PRIMARY KEY, # PostgreSQL自增用SERIAL
name VARCHAR(50) NOT NULL,
age INT,
info JSONB # 支持JSONB類(lèi)型(高效存儲(chǔ)JSON數(shù)據(jù))
);
"""
cursor.execute(create_table_sql)
print("? 表創(chuàng)建成功(若不存在)")
# 4. 插入數(shù)據(jù)(支持JSON類(lèi)型數(shù)據(jù))
insert_sql = "INSERT INTO student_info (name, age, info) VALUES (%s, %s, %s)"
# PostgreSQL占位符同樣是%s,與PyMySQL一致
insert_data = ("張三", 20, '{"class": "一班", "score": 90}') # JSON數(shù)據(jù)傳字符串
cursor.execute(insert_sql, insert_data)
# 批量插入
batch_data = [
("李四", 21, '{"class": "二班", "score": 85}'),
("王五", 19, '{"class": "一班", "score": 95}')
]
cursor.executemany(insert_sql, batch_data)
connection.commit()
print(f"? 插入數(shù)據(jù)成功,影響行數(shù):{cursor.rowcount}")
# 5. 查詢(xún)數(shù)據(jù)(支持JSON字段查詢(xún),PostgreSQL特色)
select_sql = "SELECT * FROM student_info WHERE info->>'class' = %s"
cursor.execute(select_sql, ("一班",)) # 查詢(xún)class為一班的學(xué)生
result = cursor.fetchall()
print(f"? 一班學(xué)生(共{len(result)}條):")
for row in result:
print(f"id: {row[0]}, 姓名: {row[1]}, 年齡: {row[2]}, 信息: {row[3]}")
# 6. 更新、刪除操作(與PyMySQL一致)
update_sql = "UPDATE student_info SET age = %s WHERE name = %s"
cursor.execute(update_sql, (22, "張三"))
connection.commit()
delete_sql = "DELETE FROM student_info WHERE name = %s"
cursor.execute(delete_sql, ("李四",))
connection.commit()
except Error as e:
print(f"? 數(shù)據(jù)庫(kù)操作異常:{e}")
if connection:
connection.rollback()
finally:
# 關(guān)閉資源
if cursor:
cursor.close()
if connection:
connection.close()
print("? 數(shù)據(jù)庫(kù)連接已關(guān)閉")
if __name__ == "__main__":
postgresql_demo()(4)關(guān)鍵注意事項(xiàng)
- 端口差異:PostgreSQL默認(rèn)端口是
5432,區(qū)別于MySQL的3306,避免端口混淆; - 自增字段:PostgreSQL自增字段用
SERIAL或BIGSERIAL(大整數(shù)),而非MySQL的AUTO_INCREMENT; - JSON支持:PostgreSQL原生支持JSON/JSONB類(lèi)型,插入JSON數(shù)據(jù)時(shí)需傳入字符串格式,查詢(xún)時(shí)可通過(guò)
->(獲取JSON對(duì)象)、->>(獲取JSON字符串)操作JSON字段; - 默認(rèn)用戶(hù):PostgreSQL默認(rèn)用戶(hù)是
postgres,默認(rèn)無(wú)密碼(需手動(dòng)設(shè)置密碼); - 安裝問(wèn)題:若安裝psycopg2失敗,優(yōu)先安裝psycopg2-binary(二進(jìn)制版本),避免編譯依賴(lài)問(wèn)題。
三、非關(guān)系型數(shù)據(jù)庫(kù)操作庫(kù)(重點(diǎn))
非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL)無(wú)需固定表結(jié)構(gòu),支持靈活的數(shù)據(jù)存儲(chǔ)(如JSON、鍵值對(duì)),適合大數(shù)據(jù)量、高并發(fā)、數(shù)據(jù)結(jié)構(gòu)不固定的場(chǎng)景。以下講解Python中最常用的兩個(gè)NoSQL數(shù)據(jù)庫(kù)操作庫(kù):MongoDB(文檔型)和Redis(鍵值對(duì)型)。
1. pymongo(適配MongoDB數(shù)據(jù)庫(kù))
MongoDB是一款主流的文檔型NoSQL數(shù)據(jù)庫(kù),數(shù)據(jù)以JSON格式(BSON)存儲(chǔ),無(wú)需固定表結(jié)構(gòu),靈活易用,適合Web開(kāi)發(fā)、日志存儲(chǔ)、數(shù)據(jù)分析等場(chǎng)景。Python中操作MongoDB的主流庫(kù)是 pymongo(MongoDB官方推薦)。
(1)庫(kù)介紹
- 定位:MongoDB官方Python客戶(hù)端庫(kù),功能完整、易用,支持MongoDB所有核心特性;
- 核心功能:支持文檔的增刪改查、索引、聚合查詢(xún)、事務(wù)、批量操作等,適配MongoDB 3.6+版本;
- 優(yōu)勢(shì):API簡(jiǎn)潔、靈活,與MongoDB原生語(yǔ)法高度一致,支持連接池、異步操作(motor庫(kù));
- 劣勢(shì):復(fù)雜聚合查詢(xún)的語(yǔ)法稍繁瑣,需熟悉MongoDB原生聚合管道。
(2)安裝步驟
# 安裝pymongo pip install pymongo # 若需支持異步操作(如FastAPI項(xiàng)目),安裝motor(pymongo的異步版本) # pip install motor
(3)核心用法與實(shí)戰(zhàn)示例
MongoDB核心概念(與關(guān)系型數(shù)據(jù)庫(kù)對(duì)應(yīng)):數(shù)據(jù)庫(kù)(Database)→ 集合(Collection,對(duì)應(yīng)表)→ 文檔(Document,對(duì)應(yīng)行),無(wú)需提前建庫(kù)、建集合(插入文檔時(shí)自動(dòng)創(chuàng)建)。
示例場(chǎng)景:連接本地MongoDB數(shù)據(jù)庫(kù)(默認(rèn)端口27017,無(wú)用戶(hù)名密碼),實(shí)現(xiàn)「插入文檔→查詢(xún)文檔→更新文檔→刪除文檔」完整操作。
from pymongo import MongoClient
from pymongo.errors import PyMongoError
def mongodb_demo():
# 1. 數(shù)據(jù)庫(kù)連接參數(shù)
mongo_url = "mongodb://localhost:27017/" # MongoDB默認(rèn)地址+端口
db_name = "test_mongo" # 數(shù)據(jù)庫(kù)名(不存在則自動(dòng)創(chuàng)建)
collection_name = "user" # 集合名(對(duì)應(yīng)關(guān)系型數(shù)據(jù)庫(kù)的表,不存在則自動(dòng)創(chuàng)建)
client = None
try:
# 2. 建立連接(創(chuàng)建MongoClient對(duì)象)
client = MongoClient(mongo_url)
print("? 成功連接到MongoDB數(shù)據(jù)庫(kù)")
# 3. 獲取數(shù)據(jù)庫(kù)對(duì)象
db = client[db_name]
# 4. 獲取集合對(duì)象(對(duì)應(yīng)表)
collection = db[collection_name]
# 5. 執(zhí)行操作(插入→查詢(xún)→更新→刪除)
# 5.1 插入文檔(單條+批量)
# 單條插入(文檔是字典格式,對(duì)應(yīng)JSON)
single_doc = {
"name": "張三",
"age": 25,
"gender": "男",
"info": {"city": "北京", "job": "程序員"}
}
insert_result = collection.insert_one(single_doc)
print(f"? 單條插入成功,文檔ID:{insert_result.inserted_id}")
# 批量插入(傳入列表,每個(gè)元素是字典)
batch_docs = [
{"name": "李四", "age": 28, "gender": "男", "info": {"city": "上海", "job": "產(chǎn)品經(jīng)理"}},
{"name": "王五", "age": 23, "gender": "女", "info": {"city": "廣州", "job": "設(shè)計(jì)師"}},
{"name": "趙六", "age": 30, "gender": "男", "info": {"city": "深圳", "job": "測(cè)試工程師"}}
]
batch_result = collection.insert_many(batch_docs)
print(f"? 批量插入成功,文檔IDs:{batch_result.inserted_ids}")
# 5.2 查詢(xún)文檔(單條+多條+條件查詢(xún))
# 單條查詢(xún)(根據(jù)條件查詢(xún),find_one返回第一個(gè)匹配文檔)
single_query = collection.find_one({"name": "張三"})
print(f"? 單條查詢(xún)結(jié)果:{single_query}")
# 多條查詢(xún)(查詢(xún)所有g(shù)ender為男的文檔,返回游標(biāo),需遍歷)
multi_query = collection.find({"gender": "男"})
print("? 所有男性用戶(hù):")
for doc in multi_query:
print(doc)
# 條件查詢(xún)(查詢(xún)age>25的文檔,只返回name和age字段,隱藏_id)
condition_query = collection.find(
{"age": {"$gt": 25}}, # 條件:age>25(MongoDB條件語(yǔ)法)
{"name": 1, "age": 1, "_id": 0} # 1:顯示,0:隱藏
)
print("? 年齡>25的用戶(hù)(僅顯示姓名和年齡):")
for doc in condition_query:
print(doc)
# 5.3 更新文檔(單條+多條)
# 單條更新(更新name為張三的文檔,將age改為26)
update_single = collection.update_one(
{"name": "張三"}, # 查詢(xún)條件
{"$set": {"age": 26, "info.city": "杭州"}} # 更新操作:$set表示修改指定字段
)
print(f"? 單條更新成功,匹配行數(shù):{update_single.matched_count},修改行數(shù):{update_single.modified_count}")
# 多條更新(更新所有g(shù)ender為男的文檔,將age加1)
update_multi = collection.update_many(
{"gender": "男"},
{"$inc": {"age": 1}} # $inc表示自增
)
print(f"? 多條更新成功,匹配行數(shù):{update_multi.matched_count},修改行數(shù):{update_multi.modified_count}")
# 5.4 刪除文檔(單條+多條)
# 單條刪除(刪除name為趙六的文檔)
delete_single = collection.delete_one({"name": "趙六"})
print(f"? 單條刪除成功,刪除行數(shù):{delete_single.deleted_count}")
# 多條刪除(刪除age>30的文檔)
delete_multi = collection.delete_many({"age": {"$gt": 30}})
print(f"? 多條刪除成功,刪除行數(shù):{delete_multi.deleted_count}")
except PyMongoError as e:
print(f"? MongoDB操作異常:{e}")
finally:
# 關(guān)閉連接
if client:
client.close()
print("? MongoDB連接已關(guān)閉")
if __name__ == "__main__":
mongodb_demo()(4)關(guān)鍵注意事項(xiàng)
- 連接方式:MongoDB默認(rèn)無(wú)用戶(hù)名密碼,若開(kāi)啟權(quán)限認(rèn)證,連接URL格式為
mongodb://username:password@host:port/; - 文檔格式:插入的文檔必須是字典格式(對(duì)應(yīng)BSON),支持嵌套字典(如示例中的info字段);
- 查詢(xún)條件:MongoDB的查詢(xún)條件使用特殊運(yùn)算符(如
$gt:大于、$lt:小于、$in:包含),需熟悉其語(yǔ)法; - 更新操作:必須使用
$set、$inc等更新運(yùn)算符,否則會(huì)覆蓋整個(gè)文檔(如直接傳入{“age”:26},會(huì)刪除其他所有字段); - 游標(biāo)特性:find()方法返回的是游標(biāo),而非直接返回?cái)?shù)據(jù),需遍歷游標(biāo)獲取所有結(jié)果(可使用list()轉(zhuǎn)換為列表,但大數(shù)據(jù)量不推薦);
- 索引優(yōu)化:大數(shù)據(jù)量查詢(xún)時(shí),需給常用查詢(xún)字段建立索引(如collection.create_index(“name”)),提升查詢(xún)效率。
2. redis-py(適配Redis數(shù)據(jù)庫(kù))
Redis是一款高性能的鍵值對(duì)型NoSQL數(shù)據(jù)庫(kù),數(shù)據(jù)存儲(chǔ)在內(nèi)存中,支持多種數(shù)據(jù)結(jié)構(gòu)(字符串、列表、哈希、集合、有序集合),適合緩存、會(huì)話(huà)存儲(chǔ)、計(jì)數(shù)器、消息隊(duì)列等場(chǎng)景。Python中操作Redis的主流庫(kù)是redis-py(Redis官方推薦)。
(1)庫(kù)介紹
- 定位:Redis官方Python客戶(hù)端庫(kù),輕量、高效,支持Redis所有核心特性和數(shù)據(jù)結(jié)構(gòu);
- 核心功能:支持字符串、列表、哈希等所有Redis數(shù)據(jù)結(jié)構(gòu)的操作,支持事務(wù)、管道、發(fā)布訂閱、連接池等;
- 優(yōu)勢(shì):執(zhí)行效率高(貼合Redis原生性能),API簡(jiǎn)潔,支持連接池,適配Redis 2.6+版本;
- 劣勢(shì):不支持異步操作(需使用aioredis庫(kù),異步版本),復(fù)雜場(chǎng)景需手動(dòng)封裝。
(2)安裝步驟
# 安裝redis-py(推薦最新版本) pip install redis # 若需異步操作(如異步Web項(xiàng)目),安裝aioredis # pip install aioredis
(3)核心用法與實(shí)戰(zhàn)示例
Redis核心是「鍵值對(duì)」,支持多種數(shù)據(jù)結(jié)構(gòu),每種數(shù)據(jù)結(jié)構(gòu)有對(duì)應(yīng)的操作方法。示例場(chǎng)景:連接本地Redis數(shù)據(jù)庫(kù)(默認(rèn)端口6379,無(wú)用戶(hù)名密碼),演示常用數(shù)據(jù)結(jié)構(gòu)的核心操作。
import redis
from redis.exceptions import RedisError
def redis_demo():
# 1. 數(shù)據(jù)庫(kù)連接參數(shù)
redis_config = {
"host": "localhost",
"port": 6379, # Redis默認(rèn)端口6379
"password": "", # 若有密碼,傳入密碼字符串
"db": 0, # 選擇數(shù)據(jù)庫(kù)(Redis默認(rèn)有16個(gè)數(shù)據(jù)庫(kù),編號(hào)0-15)
"decode_responses": True # 關(guān)鍵:設(shè)置為T(mén)rue,返回字符串(默認(rèn)返回bytes類(lèi)型)
}
r = None
try:
# 2. 建立連接(創(chuàng)建Redis對(duì)象,推薦使用連接池)
# 方式1:直接創(chuàng)建連接(簡(jiǎn)單場(chǎng)景)
r = redis.Redis(**redis_config)
# 方式2:使用連接池(生產(chǎn)環(huán)境推薦,避免頻繁創(chuàng)建/關(guān)閉連接)
# pool = redis.ConnectionPool(**redis_config)
# r = redis.Redis(connection_pool=pool)
# 驗(yàn)證連接(ping()返回True表示連接成功)
if r.ping():
print("? 成功連接到Redis數(shù)據(jù)庫(kù)")
# 3. 執(zhí)行操作(常用數(shù)據(jù)結(jié)構(gòu):字符串、哈希、列表、集合)
# 3.1 字符串類(lèi)型(String):最基礎(chǔ)的鍵值對(duì),適合緩存、計(jì)數(shù)器
# 設(shè)置值(key=name, value=張三,過(guò)期時(shí)間60秒)
r.set("name", "張三", ex=60)
# 獲取值
name = r.get("name")
print(f"? 字符串查詢(xún):name = {name}")
# 自增(計(jì)數(shù)器)
r.incr("count") # count從0變?yōu)?
r.incr("count", 2) # count從1變?yōu)?
count = r.get("count")
print(f"? 計(jì)數(shù)器:count = {count}")
# 刪除值
r.delete("count")
print(f"? 字符串刪除:count是否存在 = {r.exists('count')}") # exists返回0表示不存在
# 3.2 哈希類(lèi)型(Hash):適合存儲(chǔ)對(duì)象(如用戶(hù)信息),鍵值對(duì)嵌套
# 設(shè)置哈希值(key=user:1,字段name、age、gender)
r.hset("user:1", mapping={
"name": "李四",
"age": 28,
"gender": "男"
})
# 獲取單個(gè)字段值
user_name = r.hget("user:1", "name")
print(f"? 哈希查詢(xún)(單個(gè)字段):user:1.name = {user_name}")
# 獲取所有字段和值
user_all = r.hgetall("user:1")
print(f"? 哈希查詢(xún)(所有字段):user:1 = {user_all}")
# 獲取所有字段名
user_fields = r.hkeys("user:1")
print(f"? 哈希查詢(xún)(所有字段名):user:1.fields = {user_fields}")
# 3.3 列表類(lèi)型(List):有序、可重復(fù),適合消息隊(duì)列、排行榜
# 向列表左側(cè)添加值
r.lpush("book_list", "Python編程", "Java編程", "SQL必知必會(huì)")
# 向列表右側(cè)添加值
r.rpush("book_list", "Redis實(shí)戰(zhàn)")
# 獲取列表長(zhǎng)度
book_len = r.llen("book_list")
print(f"? 列表長(zhǎng)度:book_list.length = {book_len}")
# 獲取列表所有值(0表示第一個(gè),-1表示最后一個(gè))
book_all = r.lrange("book_list", 0, -1)
print(f"? 列表查詢(xún)(所有值):book_list = {book_all}")
# 彈出列表左側(cè)值(消息隊(duì)列常用)
book_pop = r.lpop("book_list")
print(f"? 列表彈出(左側(cè)):彈出值 = {book_pop},剩余列表 = {r.lrange('book_list', 0, -1)}")
# 3.4 集合類(lèi)型(Set):無(wú)序、不可重復(fù),適合去重、交集/并集查詢(xún)
# 向集合添加值
r.sadd("user_set", "張三", "李四", "王五", "張三") # 重復(fù)值會(huì)自動(dòng)去重
# 獲取集合所有值
user_set_all = r.smembers("user_set")
print(f"? 集合查詢(xún)(所有值):user_set = {user_set_all}")
# 判斷值是否在集合中
is_exist = r.sismember("user_set", "張三")
print(f"? 集合判斷:張三是否在user_set中 = {is_exist}")
# 獲取集合長(zhǎng)度
user_set_len = r.scard("user_set")
print(f"? 集合長(zhǎng)度:user_set.length = {user_set_len}")
# 3.5 事務(wù)操作(Redis事務(wù):批量執(zhí)行,要么全部成功,要么全部失敗)
pipe = r.pipeline() # 創(chuàng)建管道(事務(wù)載體)
pipe.set("tx1", "test1")
pipe.set("tx2", "test2")
pipe.incr("tx3")
pipe.execute() # 執(zhí)行事務(wù)
print(f"? 事務(wù)執(zhí)行成功:tx1 = {r.get('tx1')}, tx2 = {r.get('tx2')}, tx3 = {r.get('tx3')}")
except RedisError as e:
print(f"? Redis操作異常:{e}")
finally:
# 關(guān)閉連接(使用連接池時(shí),無(wú)需手動(dòng)關(guān)閉,連接池會(huì)自動(dòng)管理)
if r:
r.close()
print("? Redis連接已關(guān)閉")
if __name__ == "__main__":
redis_demo()(4)關(guān)鍵注意事項(xiàng)
- decode_responses參數(shù):必須設(shè)置為
True,否則所有返回值都是bytes類(lèi)型(需手動(dòng)解碼為字符串),開(kāi)發(fā)中極易出錯(cuò); - 連接池優(yōu)化:生產(chǎn)環(huán)境必須使用連接池(ConnectionPool),避免頻繁創(chuàng)建/關(guān)閉連接,提升效率;連接池參數(shù)可根據(jù)并發(fā)量調(diào)整(如max_connections=100);
- 數(shù)據(jù)結(jié)構(gòu)選型:根據(jù)場(chǎng)景選擇合適的數(shù)據(jù)結(jié)構(gòu)(如緩存用戶(hù)信息用Hash,消息隊(duì)列用List,計(jì)數(shù)器用String,去重用Set);
- 過(guò)期時(shí)間:緩存場(chǎng)景需給鍵設(shè)置過(guò)期時(shí)間(ex參數(shù),單位秒;px參數(shù),單位毫秒),避免內(nèi)存溢出;
- 事務(wù)特性:Redis事務(wù)是“弱事務(wù)”,僅保證批量執(zhí)行,不支持回滾(執(zhí)行過(guò)程中出錯(cuò),已執(zhí)行的命令不會(huì)回滾);
- 密碼與權(quán)限:生產(chǎn)環(huán)境需給Redis設(shè)置密碼,連接時(shí)傳入password參數(shù);同時(shí)限制Redis訪問(wèn)IP,避免安全漏洞;
- 序列化:若需存儲(chǔ)字典、列表等復(fù)雜數(shù)據(jù),需先序列化(如json.dumps()),讀取時(shí)再反序列化(json.loads()),因?yàn)镽edis僅支持字符串類(lèi)型的鍵值對(duì)。
四、通用進(jìn)階技巧(生產(chǎn)環(huán)境必備)
無(wú)論使用哪種數(shù)據(jù)庫(kù)、哪種操作庫(kù),以下進(jìn)階技巧都是生產(chǎn)環(huán)境必備,可提升腳本穩(wěn)定性、效率和安全性,統(tǒng)一梳理如下:
1. 異常處理全覆蓋
必須捕獲所有可能的異常(如連接失敗、SQL錯(cuò)誤、Redis超時(shí)等),避免程序崩潰;同時(shí)在異常時(shí)做兜底處理(如事務(wù)回滾、日志記錄),便于問(wèn)題排查。
2. 連接池管理
生產(chǎn)環(huán)境中,頻繁創(chuàng)建/關(guān)閉數(shù)據(jù)庫(kù)連接會(huì)嚴(yán)重影響效率,所有庫(kù)都支持連接池(PyMySQL用DBUtils,pymongo用MongoClient內(nèi)置連接池,redis用ConnectionPool),需合理配置連接池參數(shù)(最大連接數(shù)、超時(shí)時(shí)間等)。
3. 避免SQL注入(關(guān)系型數(shù)據(jù)庫(kù))
所有關(guān)系型數(shù)據(jù)庫(kù)(MySQL、PostgreSQL、SQLite)的SQL語(yǔ)句,必須使用占位符傳遞參數(shù),不可直接拼接SQL字符串,避免SQL注入漏洞(重點(diǎn)!)。
4. 日志記錄
在數(shù)據(jù)庫(kù)操作的關(guān)鍵節(jié)點(diǎn)(連接、執(zhí)行SQL、異常)添加日志記錄(使用Python內(nèi)置logging庫(kù)),便于后續(xù)排查問(wèn)題(如定位SQL執(zhí)行失敗的原因、連接超時(shí)的場(chǎng)景)。
5. 數(shù)據(jù)序列化(非關(guān)系型數(shù)據(jù)庫(kù))
MongoDB、Redis存儲(chǔ)復(fù)雜數(shù)據(jù)(字典、列表)時(shí),需先序列化(如json.dumps()),讀取時(shí)反序列化,確保數(shù)據(jù)完整性。
6. 批量操作優(yōu)先
插入、更新、刪除大量數(shù)據(jù)時(shí),優(yōu)先使用批量操作(如executemany、insert_many、hmset),避免單條循環(huán)操作,提升執(zhí)行效率(批量操作可減少網(wǎng)絡(luò)交互次數(shù))。
7. 權(quán)限與安全
生產(chǎn)環(huán)境中,數(shù)據(jù)庫(kù)必須設(shè)置密碼、限制訪問(wèn)IP;敏感數(shù)據(jù)(如密碼、數(shù)據(jù)庫(kù)地址)不可硬編碼在代碼中,需使用配置文件(如config.ini)或環(huán)境變量存儲(chǔ)。
五、總結(jié)
Python中數(shù)據(jù)庫(kù)操作庫(kù)豐富多樣,核心可分為「關(guān)系型數(shù)據(jù)庫(kù)庫(kù)」和「非關(guān)系型數(shù)據(jù)庫(kù)庫(kù)」,選擇時(shí)需遵循「場(chǎng)景適配」原則,總結(jié)如下:
1. 庫(kù)選型建議
- MySQL數(shù)據(jù)庫(kù):優(yōu)先使用 PyMySQL(Python 3.x,跨平臺(tái));
- SQLite數(shù)據(jù)庫(kù):直接使用Python內(nèi)置 sqlite3(輕量、無(wú)需部署,適合小型場(chǎng)景);
- PostgreSQL數(shù)據(jù)庫(kù):優(yōu)先使用 psycopg2-binary(二進(jìn)制版本,安裝簡(jiǎn)單,效率高);
- MongoDB數(shù)據(jù)庫(kù):優(yōu)先使用 pymongo(官方推薦,功能完整),異步場(chǎng)景用motor;
- Redis數(shù)據(jù)庫(kù):優(yōu)先使用 redis-py(官方推薦,高效),異步場(chǎng)景用aioredis。
2. 核心要點(diǎn)
- 所有數(shù)據(jù)庫(kù)操作,均遵循「連接→操作→關(guān)閉」的核心邏輯,重點(diǎn)關(guān)注資源釋放;
- 生產(chǎn)環(huán)境必備:異常處理、連接池、日志記錄、權(quán)限安全,缺一不可;
- 避免常見(jiàn)坑點(diǎn):SQL注入(關(guān)系型)、bytes類(lèi)型(Redis)、文檔覆蓋(MongoDB)、連接泄露(所有庫(kù));
- 實(shí)戰(zhàn)為王:本文所有示例均可直接復(fù)制運(yùn)行,建議結(jié)合實(shí)際數(shù)據(jù)庫(kù)環(huán)境,動(dòng)手實(shí)操一遍,快速掌握核心用法。
Python數(shù)據(jù)庫(kù)操作庫(kù)的核心是「簡(jiǎn)化與數(shù)據(jù)庫(kù)的交互」,無(wú)需深入理解數(shù)據(jù)庫(kù)底層原理,只需掌握對(duì)應(yīng)庫(kù)的API和選型原則,就能高效完成數(shù)據(jù)庫(kù)操作。后續(xù)可根據(jù)具體項(xiàng)目場(chǎng)景,深入學(xué)習(xí)某一個(gè)庫(kù)的高級(jí)特性(如MongoDB聚合查詢(xún)、Redis管道、PostgreSQL JSON操作),進(jìn)一步提升開(kāi)發(fā)效率。
到此這篇關(guān)于Python中數(shù)據(jù)庫(kù)操作庫(kù)詳解的文章就介紹到這了,更多相關(guān)Python數(shù)據(jù)庫(kù)操作庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python開(kāi)發(fā)入門(mén)——set的使用
這篇文章主要介紹了python set的使用,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-09-09
使用Python代碼實(shí)現(xiàn)PDF文檔與SVG文件之間的轉(zhuǎn)換
PDF作為普遍采用的文件格式,確保了文檔的一致性和可靠性,而SVG(可縮放矢量圖形)則因其矢量性質(zhì),在網(wǎng)頁(yè)設(shè)計(jì)、高分辨率打印及動(dòng)態(tài)交互內(nèi)容中展現(xiàn)出無(wú)與倫比的優(yōu)勢(shì),本文將介紹如何使用Python將PDF文件轉(zhuǎn)換為SVG文件以及將SVG文件轉(zhuǎn)換為PDF文件,需要的朋友可以參考下2024-05-05
Python中staticmethod和classmethod的作用與區(qū)別
今天小編就為大家分享一篇關(guān)于Python中staticmethod和classmethod的作用與區(qū)別,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
Numpy中np.random.rand()和np.random.randn() 用法和區(qū)別詳解
這篇文章主要介紹了Numpy中np.random.rand()和np.random.randn() 用法和區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
7個(gè)實(shí)用的Python自動(dòng)化代碼別再重復(fù)造輪子了
關(guān)于Python有一句名言:不要重復(fù)造輪子,給大家分享經(jīng)過(guò)Python3.6.4調(diào)試通過(guò)的代碼,感興趣的朋友跟隨小編一起看看吧2023-11-11
Python函數(shù)中的可變長(zhǎng)參數(shù)詳解
在本篇文章里小編給大家整理的是關(guān)于Python函數(shù)中的可變長(zhǎng)參數(shù)的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們參考下。2019-09-09
備戰(zhàn)618!用Python腳本幫你實(shí)現(xiàn)淘寶秒殺
本次的文章,分享一個(gè)淘寶秒殺腳本,這個(gè)腳本用Python編寫(xiě),使用了Python庫(kù)selenium,并且通過(guò)selenium + chromedriver,用程序控制chrome瀏覽器,完成搶購(gòu)的一系列操作.有了這個(gè)腳本,大家至少可以與其他的機(jī)器人站在同一起跑線上,公平搶購(gòu)喜歡的寶貝 ,需要的朋友可以參考下2021-06-06
使用Python生成條形碼圖片的實(shí)戰(zhàn)代碼
在自動(dòng)化生產(chǎn)、物流配送、商超系統(tǒng)等日常業(yè)務(wù)中,條形碼已成為數(shù)據(jù)快速讀取與追蹤的核心方式,相比手工設(shè)計(jì),使用 Python 編程生成條形碼圖片,能顯著提升效率并支持批量處理,本文將介紹如何使用Python生成條形碼,需要的朋友可以參考下2025-05-05

