FastAPI数据库创建表工具Alembic使用方法
Alembic初始化
# 激活虚拟环境安装alembic
pip install alembic
alembic init alembic
会自动生成alembic目录
里面包含内容如下
alembic
│ env.py
│ README
│ script.py.mako
└─versions
SQLModel代码编写
文件路径:项目/module/users.py
from sqlmodel import SQLModel, Field
from typing import Optional
class User(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
username: str
password: str
class Role(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
class Permission(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
修改 项目/module/__init__.py
# 导入所有model
from . import *
模板文件修改
为了管理sqlmodel的数据模型需要更改模板文件防止自动生成的迁移脚本无法运行
在 import sqlalchemy as sa
下方添加 import sqlmodel
"""${message}
Revision ID: ${up_revision}
Revises: ${down_revision | comma,n}
Create Date: ${create_date}
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
import sqlmodel
${imports if imports else ""}
# revision identifiers, used by Alembic.
revision: str = ${repr(up_revision)}
down_revision: Union[str, None] = ${repr(down_revision)}
branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)}
depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)}
def upgrade() -> None:
${upgrades if upgrades else "pass"}
def downgrade() -> None:
${downgrades if downgrades else "pass"}
配置数据引擎读取自定义配置
由于我们写项目不可能一个组件一个配置,故都要使用统一的配置文件
我这里以config.ini
文件做举例,config.ini
文件在项目 根目录 请注意
[mysql]
mysql_host=192.168.1.3
mysql_user=root
mysql_pass=123456
mysql_port=3306
mysql_db=ppa
[redis]
redis_host=10.0.0.2
redis_port=6379
redis_db=0
然后alembic自动生成的env.py加入以下代码,注意看注释
import configparser # 导入的模块
from logging.config import fileConfig # 导入的模块
from urllib.parse import quote_plus # 导入的模块
from sqlalchemy import engine_from_config # 原有配置不需要修改
from sqlalchemy import pool # 原有配置不需要修改
from alembic import context # 原有配置不需要修改
################################ 添加的内容 ################################
# 使用 configparser 读取另外一个.ini文件
config_parser = configparser.ConfigParser()
config_parser.read('config.ini')
host = config_parser.get('mysql', 'mysql_host')
user = config_parser.get('mysql', 'mysql_user')
password = quote_plus(config_parser.get('mysql', 'mysql_pass')).replace("%", "%%")
port = config_parser.get('mysql', 'mysql_port')
db = config_parser.get('mysql', 'mysql_db')
database_url = f"mysql+pymysql://{user}:{password}@{host}:{port}/{db}?charset=utf8mb4"
###########################################################################
# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config # 原有配置不需要修改
config.set_main_option('sqlalchemy.url', database_url) # 新增内容
# Interpret the config file for Python logging.
# This line sets up loggers basically.
if config.config_file_name is not None:
fileConfig(config.config_file_name)
# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
from sqlmodel import SQLModel # 导入模块
target_metadata = SQLModel.metadata # 指定元数据
# 以下内容不做修改
....
执行表生成
在项目根目录
alembic revision --autogenerate -m "自定义备注"
alembic upgrade head