发布于 2026-01-06 1 阅读
0

使用 Python 和 Alembic 简化数据库迁移 🟣 ORM(对象关系映射)🟣 SQLAlchemy 🟣 数据库迁移 🟣 什么是 Alembic? 🟣 什么是审计 Alembic? ⚙️ Alembic 教程 ⚙️ 数据库迁移:Alembic 快速入门教程 📚 参考资料

使用 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。

GitHub 标志 r0mymendez /数据库迁移

教程:如何在 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