使用 Python 和 Alembic 简化数据库迁移
🟣 ORM(对象关系映射)
🟣 SQLAlchemy
🟣 数据库迁移
🟣 什么是 Alembic?
🟣 什么是 Audit alembic?
⚙️ Alembic教程
⚙️ 数据库迁移:Alembic 教程
快速入门
📚 参考资料
本文将探讨如何使用流行的 Python 库 Alembic 进行数据库迁移。不过,在深入学习之前,我们将先介绍一些定义,以帮助我们更好地理解 Alembic 的工作原理以及实现数据库迁移的最佳方法。
🟣 ORM(对象关系映射)
ORM(对象关系映射)是一个允许将 面向对象 编程与关系数据库连接起来的层,它抽象了底层的 SQL 查询。
🟣 SQLAlchemy
SQLAlchemy 是一个 Python 库,它实现了 ORM,并允许您对相关数据库执行不同的操作。
以下是 SQLAlchemy 的关键组成部分,有助于理解它如何与数据库交互:
🟣 引擎 :它是允许与数据库交互的接口。它处理连接并执行查询。
🟣连接池 :它是连接的集合,允许重用连接并通过减少时间来提高查询性能。
🟣 方言 :它是允许与数据库交互的组件。每个方言都旨在与特定数据库进行交互并转换查询;默认情况下,此库包含 MySQL、MariaDB、PostgreSQL、SQL Server 和 Oracle 的方言。此外,还有一些外部方言,您需要导入其他库才能使用,如下图所示。
🟣 DBAPI :它是提供方法以实现 Python 和数据库之间通信的接口。
以下是一个如何在 SQL 和 SQLAlchemy 中执行查询的简单示例:
SELECT
customer_id ,
customer_unique_id ,
customer_zip_code_prefix ,
customer_city ,
customer_state
FROM ecommerce . customers
LIMIT 10 ;
Enter fullscreen mode
Exit fullscreen mode
from sqlalchemy import Column , Integer , String , create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# Create a base class which allows us to define classes that map to tables
Base = declarative_base ()
# Define the class that maps to the table
class Customer ( Base ):
__tablename__ = ' customers ' # Cambia a minúsculas
__table_args__ = { ' schema ' : ' ecommerce ' }
customer_id = Column ( Integer , primary_key = True )
customer_unique_id = Column ( Integer )
customer_zip_code_prefix = Column ( Integer )
customer_city = Column ( String )
customer_state = Column ( String )
# Create an engine that connects to the PostgreSQL server
conn = ' postgresql://postgres:postgres@localhost/postgres '
engine = create_engine ( conn )
# Create a session
conn_session = sessionmaker ( bind = engine )
session = conn_session ()
# Execute the query
customers = session . query ( Customer ). limit ( 10 )
# Extract the data and create a list of tuples
data = [ ( customer . customer_id ,
customer . customer_unique_id ,
customer . customer_zip_code_prefix ,
customer . customer_city ,
customer . customer_state )
for customer in customers ]
Enter fullscreen mode
Exit fullscreen mode
🟣 数据库迁移
迁移是允许您修改数据库结构的过程,创建这些迁移是为了维护一致性和完整性。
🟣 使用迁移有什么好处?
🟣 版本控制 :通过对模式版本进行控制,避免对数据库进行人工干预。
🟣 环境管理 :通过应用迁移来促进新环境的创建,从而能够轻松重现特定配置并保持它们之间的一致性。
🟣 升级与降级 :另一个优势在于不仅可以应用更改,还可以撤销更改。这为数据库管理提供了灵活性和安全性。
🟣 审计 :Alembic-audit 是另一个可以用来维护数据库更改时间记录的库,从而方便追溯。
🟣 CI/CD 集成 :轻松集成到 CI/CD 管道中,自动应用数据库更改,简化并确保应用程序部署的一致性。
🟣 标准化 :此实现方案能够以更清晰、结构化和一致的方式定义和应用数据库模式变更。通过使用模板,可以促进脚本重用,从而确保高效且一致地管理数据库变更。
🟣 什么是 Alembic?
Alembic 是一个 Python 库,它支持可控的自动化数据库迁移。该库利用 脚本 SQLAlchemy来管理数据库模式的变更 ,这些脚本描述了修改内容,并且可以自动应用这些修改。
🟣 什么是 Audit alembic?
Audit Alembic 是一个 🐍Python 库,它通过提供一个包含已应用更改的详细记录的审计表来补充 Alembic。
虽然 Alembic 通常只在数据库中维护一个表,其中包含 ID上次应用的迁移,并允许使用 history命令跟踪文件,但 Audit Alembic 更进一步,创建了一个额外的表,以方便更改跟踪并允许向已应用的事务添加元数据。
列名
列描述
id
唯一标识符
alembic_version
迁移版本
prev_alembic_version
先前版本的迁移
operation
“迁移”或“回滚”
operation_direction
操作类型(升级或降级)
user_verion
在本例中,我们使用时间戳作为迁移的用户版本。
changed_at
迁移时间戳
⚙️ Alembic教程
您可以在此链接 的 🐍 Python notebook 中找到完整的代码和分步示例 。不过,本文的其余部分将简要概述主要命令。有关详细命令和 Audit Alembic 的实现,请参阅 notebook。
教程:如何在 Python 中使用 Alembic 进行数据库迁移
⚙️ 数据库迁移:Alembic 教程
教程:如何在 Python 中使用 Alembic 进行数据库迁移
目录
你可以在 Python Notebook 中找到所有教程, alembic_tutorial.ipynb其中包含以下几点的解释:
🔧 数据库迁移
🔧 什么是 Alembic?
🔧 先决条件
🔧 Alembic:配置
🔧 Alembic:创建我们的第一个迁移
🔍什么是审计蒸馏器?
🔧 数据库迁移
迁移是允许您修改数据库结构的过程,创建这些迁移是为了维护一致性和完整性。
✅ 版本控制 :通过控制模式版本,避免对数据库进行人工干预。
✅ 环境管理 :通过应用迁移来促进新环境的创建,从而可以轻松重现特定配置并保持它们之间的一致性。
✅ 升级和降级 :另一个优势是不仅可以应用更改,还可以撤销更改。这提供了灵活性……
欢迎查看,如果觉得有用请给它点个赞!⭐️
🔧 先决条件
🐳 Docker
🐙 Docker Compose
🐍 安装 Python 库: !pip install alembic Audit-Alembic
快速入门
🔧 创建 PostgreSQL 数据库
1️⃣ - 创建 docker-compose.yml 文件
version : " 3.7"
services :
db :
image : postgres:13.3-alpine
volumes :
- ./db_data:/var/lib/postgresql/data
environment :
POSTGRES_USER : postgres
POSTGRES_PASSWORD : postgres
POSTGRES_DB : postgres
ports :
- " 5433:5432"
volumes :
db_data :
Enter fullscreen mode
Exit fullscreen mode
2️⃣ - 创建 postgres 数据库 在终端中执行: docker-compose -f docker-compose.yml up --build
3️⃣ - 检查容器是否正在运行 。在终端中执行以下命令: docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
edb1f7077e66 sqla_db "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:5433->5432/tcp, :::5433->5432/tcp sqla_db_1
Enter fullscreen mode
Exit fullscreen mode
🔧 Alembic:配置
1️⃣ - 创建一个新的 Alembic 环境 现在,我们将创建一个新的 Alembic 项目。为此,我们需要执行以下命令,该命令将创建一组目录和文件。
alembic init project
Enter fullscreen mode
Exit fullscreen mode
2️⃣ - 文件和新目录
文件名
描述
📄 alembic.ini
此文件是 Alembic 的主配置文件,其中包含 Alembic 环境的配置设置。
📁 project\verions
此目录将用于存储迁移脚本。
📄 project\env.py
此Python脚本包含执行迁移脚本的函数。
📄 project\script.py.mako
此文件是生成新迁移脚本的模板。
📄 project\README
此文件包含目录的简短描述。
3️⃣ - 添加数据库连接 在 alembic.ini 文件中,将数据库连接字符串添加到 sqlalchemy.url 变量中。连接字符串的格式应为:
sqlalchemy . url = driver : // user : pass @localhost / dbname
Enter fullscreen mode
Exit fullscreen mode
就我而言,我需要配置以下连接
驱动程序:PostgreSQL
用户:postgres
密码:postgres
数据库名称:postgres
sqlalchemy . url = postgresql : // postgres : postgres @localhost : 5433 / postgres
Enter fullscreen mode
Exit fullscreen mode
4️⃣ - 文件名模板 我们可以取消注释文件中的以下行, alembic.ini以更改 Alembic 创建的文件的名称,从而确保创建的文件按时间顺序排列。
file_template = %%( year) d_%%( month) .2d_%%( day) .2d_%%( hour) .2d%%( minute) .2d-%%( rev) s_%%( slug) s
Enter fullscreen mode
Exit fullscreen mode
🔧 Alembic:创建我们的第一个迁移
1️⃣ - 创建迁移脚本
alembic revision -m "create schema ecommerce"
Enter fullscreen mode
Exit fullscreen mode
现在您可以看到新创建的文件 project/version folder,该文件的名称如下:
{current_timestamp}-{unique_identifier}_create_schema_ecommerce.py
当前时间戳
在我的例子中,唯一标识符是 9ec3d7e4bde9
我在命令中添加的消息,只是将空格替换成了下划线。
2️⃣ - 修改迁移文件 在本例中,我们将为电子商务项目创建模式。但是,Alembic 没有专门用于此任务的方法。因此,我们将使用 op.execute 方法来执行创建模式的 SQL 查询。
# alembic does not support creating schema directly and we need to use op.execute
def upgrade () -> None :
op . execute ( ' CREATE SCHEMA IF NOT EXISTS ecommerce_olist; ' )
def downgrade () -> None :
op . execute ( ' DROP SCHEMA IF EXISTS ecommerce_olist CASCADE; ' )
Enter fullscreen mode
Exit fullscreen mode
3️⃣ - 执行迁移 以下命令将执行迁移并在数据库中创建模式。如果看到“完成”消息,则表示迁移成功。您还可以检查数据库以验证新模式是否已创建以及 Alembic 版本表是否已更新。
alembic upgrade head
Enter fullscreen mode
Exit fullscreen mode
4️⃣ - 检查迁移 现在,我们可以验证当前执行的迁移。这可以通过 Alembic 命令或检查之前创建的表来控制。
alembic current
Enter fullscreen mode
Exit fullscreen mode
INFO [ alembic.runtime.migration] Context impl PostgresqlImpl.
INFO [ alembic.runtime.migration] Will assume transactional DDL.
b1bc43e2f536 ( head )
Enter fullscreen mode
Exit fullscreen mode
5️⃣ - 迁移历史记录 此外,我们可以使用以下命令查看此项目中已执行的所有迁移。 这将显示详细的迁移历史记录,包括修订 ID、父修订、迁移文件路径以及每次迁移中所做的更改的描述。
alembic history --verbose
Enter fullscreen mode
Exit fullscreen mode
Rev: b1bc43e2f536 ( head )
Parent: 784a7abb86b7
Path: /project/versions/2024_04_01_1719-b1bc43e2f536_create_table_customer.py
create table customer
Revision ID: b1bc43e2f536
Revises: 784a7abb86b7
Create Date: 2024-04-01 17:19:09.844065
Rev: 784a7abb86b7
Parent: <base>
Path: /project/versions/2024_04_01_1718-784a7abb86b7_create_schema_ecommerce.py
create schema ecommerce
Revision ID: 784a7abb86b7
Revises:
Create Date: 2024-04-01 17:18:06.680872
Enter fullscreen mode
Exit fullscreen mode
6️⃣ - 降级迁移 以下代码允许您还原之前所做的更改。
alembic downgrade -1
Enter fullscreen mode
Exit fullscreen mode
如前所述,别忘了查看我的 存储库, 其中包含分步指南和 Audit Alembic 的实现,使您能够拥有一个可追溯更改的表格。
如果你觉得有用,可以给它一颗星⭐️。
记住,拥有一个 能够将更改应用 到数据库的工具始终是一种良好的开发实践,它可以确保 一致性 , 避免手动任务 ,并 能够快速重现 新环境。
📚 参考资料
如果你想学习……
1. Alembic 官方文档 2. SQLAlchemy 3. Audit-Alembic
文章来源:https://dev.to/r_elena_mendez_escobar/simplify-database-migrations-using-python-with-alembic-4bhd