如何購買建設(shè)網(wǎng)站系統(tǒng)it培訓(xùn)班真的有用嗎
SQLAlchemy-2.0中模型定義和alembic的數(shù)據(jù)庫遷移工具
- 一、SQLAIchemy的介紹
- 二、數(shù)據(jù)庫引擎
- 1、支持的數(shù)據(jù)庫
- 1.1、sqlite數(shù)據(jù)庫
- 1.2、MySQL數(shù)據(jù)庫
- 1.3、數(shù)據(jù)庫引擎的參數(shù)
- 三、定義模型類
- 1、定義模型
- 2、engine負責(zé)數(shù)據(jù)庫遷移
- 四、alembic數(shù)據(jù)庫遷移?具
- 1、安裝alembic
- 2、初始化alembic環(huán)境
- 3、修改配置和環(huán)境
- 4、執(zhí)?命令
一、SQLAIchemy的介紹
SQLAlchemy 是 Python 生態(tài)系統(tǒng)中最流行的 ORM。SQLAlchemy 設(shè)計非常優(yōu)雅,分為了兩部分——底層的 Core 和上層的傳統(tǒng)ORM。在 Python 乃至其他語言的大多數(shù) ORM 中,都沒有實現(xiàn)很好的分層設(shè)計,比如 django 的 ORM,數(shù)據(jù)庫鏈接和 ORM 本身完全混在一起。
SQLAlchemy 是 Python 中一個通過 ORM 操作數(shù)據(jù)庫的框架。
SOLAIchemy對象關(guān)系映射器提供了一種方法,用于將用戶定義的Python類與數(shù)據(jù)庫表相關(guān)聯(lián),并將這些類(對象)的實例與其對應(yīng)表中的行相關(guān)聯(lián)。它包括一個透明地同步對象及其相關(guān)行之間狀態(tài)的所有變化的系統(tǒng),稱為工作單元,以及根據(jù)用戶定義的類及其定義的彼此之間的關(guān)系表達數(shù)據(jù)庫查詢的系統(tǒng)。
可以讓我們使用類和對象的方式操作數(shù)據(jù)庫,從而從繁瑣的 sql語句中解脫出來。
ORM 就是: Obiect Relational Mapper 的簡寫,就是關(guān)系對象映射器的意思。
二、數(shù)據(jù)庫引擎
任何SQLAlchemy應(yīng)用程序的開始都是一個名為 Engine.此對象充當(dāng)連接到特定數(shù)據(jù)庫的中心源,提供工廠和稱為 connection pool對于這些數(shù)據(jù)庫連接。引擎通常是一個只為特定數(shù)據(jù)庫服務(wù)器創(chuàng)建一次的全局對象,并使用一個URL字符串進行配置,該字符串將描述如何連接到數(shù)據(jù)庫主機或后端。
sqlalchemy使用create_engine()函數(shù)從URL生成一個數(shù)據(jù)庫引擎對象。例如:
engine=create_engine(r"sqlite:///C:\path\to\foo.db")
1、支持的數(shù)據(jù)庫
URL通??梢园??名、密碼、主機名、數(shù)據(jù)庫名以及?于其他配置的可選關(guān)鍵字參數(shù)。主題格式
為:
1.1、sqlite數(shù)據(jù)庫
sqlite使?python內(nèi)置模塊連接到基于?件的數(shù)據(jù)庫sqlite3 默認情況下。
1.2、MySQL數(shù)據(jù)庫
mysql??使?mysql python作為默認dbapi。mysql dbapis有很多,包括pymysql和mysqlclient:
from sqlalchemy import create_engineengine = create_engine('mysql+pymysql://root:root@localhost:3306/test_db2?charset=utf8')
1.3、數(shù)據(jù)庫引擎的參數(shù)
- echo=False–如果為真,引擎將記錄所有語句以及repr()其參數(shù)列表的默認?志處理程序
- future --使?2.0樣式Engine和Connection API。
- logging_name–將在“sqlalChemy.engine”記錄器中?成的?志記錄的“name”字段中使?的
字符串標識符。 - pool_size=5 #連接池的??默認為5個,設(shè)置為0時表?連接?限制
- pool_recycle=3600,#設(shè)置時間以限制數(shù)據(jù)庫?動斷開
- pool_timeout:連接超時時間,默認為30秒,超過時間的連接都會連接失敗。
三、定義模型類
這種模型類結(jié)構(gòu)稱為聲明性映射,它同時定義了 Python 對象模型,以及描述的數(shù)據(jù)庫元數(shù)據(jù) 在特定數(shù)據(jù)庫中存在或?qū)⒁嬖诘?br /> 真實 數(shù)據(jù)庫 表。
映射從一個基類開始,并且是 通心對類的繼承來創(chuàng)建一個簡單的子類。這里的父類是:Base 模型類。
1、定義模型
# 定義一個模型類的基類
class Base(DeclarativeBase):# 所有的模型類都有的屬性和字段映射create_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), comment="創(chuàng)建時間")update_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), onupdate=func.now(),comment="更新時間")
import enum
from decimal import Decimalfrom sqlalchemy import String, DECIMAL, Boolean
from sqlalchemy.orm import Mapped, mapped_columnfrom ch04.db_main import Base, engineclass SexValue(enum.Enum):"""通過枚舉,可以給一些屬性(字段)設(shè)置預(yù)設(shè)值"""MALE = "男"FEMALE = "女"class Employee(Base):"""員工的模型類"""__tablename__ = "t_emp"id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)name: Mapped[str] = mapped_column(String(40), name="emp_name", unique=True, nullable=False) # 不允許為空# DECIMAL:10:總位數(shù),2:小數(shù)點后位數(shù)sal: Mapped[Decimal] = mapped_column(DECIMAL(10, 2), nullable=True, comment="員工的基本薪資")bonus: Mapped[int] = mapped_column(default=0, comment="員工的津貼")is_leave: Mapped[bool] = mapped_column(Boolean, default=False, comment="員工是否離職,True表示離職,False表示在職")gender: Mapped[SexValue]if __name__ == '__main__':# 數(shù)據(jù)庫遷移# 創(chuàng)建表Base.metadata.create_all(engine)
2、engine負責(zé)數(shù)據(jù)庫遷移
# 所有的表都重新創(chuàng)建
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)
# 單獨把某個表創(chuàng)建?下
Employee.__table__.drop(engine)
Employee.__table__.create(engine)
四、alembic數(shù)據(jù)庫遷移?具
Alembic使?SQLAlchemy作為底層引擎,為關(guān)系數(shù)據(jù)庫提供變更腳本的創(chuàng)建、管理和調(diào)?。
1、安裝alembic
pip install alembic
2、初始化alembic環(huán)境
命令:alembic init alembic
3、修改配置和環(huán)境
4、執(zhí)?命令
# ?動?成遷移腳本
alembic revision --autogenerate -m "init commit" # 注意修改了orm之后,修改-m后遷移腳
# 數(shù)據(jù)庫遷移命令
alembic upgrade head
查看數(shù)據(jù)庫的版本號與versions中生成的版本號一致
? alembic upgrade head :將數(shù)據(jù)庫升級到最新版本。
? alembic downgrade base :將數(shù)據(jù)庫降級到最初版本。
? alembic upgrade :將數(shù)據(jù)庫升級到指定版本。
? alembic downgrade :將數(shù)據(jù)庫降級到指定版本。
演示版本降級: