上一节已经写好了数据库操作的基类封装,本节主要是针对数据库模型的编写和更新同步。
生成数据库模型
在 models 模块下新建一个models_user.py文件,引入 sqlalchemy 编写数据库模型,具体代码如下:
from sqlalchemy import (
Column,
Integer,
String,
Boolean,
DateTime
)
from datetime import datetime
from src.app.core.db.base import Base
__all__ = [
"User"
]
class User(Base):
__tablename__ = "user"
id = Column(Integer, primary_key=True, index=True)
mobile = Column(String(20), nullable=True)
username = Column(String(20), nullable=True)
password = Column(String(50), nullable=True)
mailbox = Column(String(100), nullable=True)
is_delete = Column(Boolean, default=False)
created_time = Column(DateTime, default=datetime.now())
updated_time = Column(DateTime, onupdate=datetime.now,
default=datetime.now())
def __repr__(self):
return f"""
<Users(
id='{self.id}', mobile='{self.mobile}', username='{self.username}',
password='{self.password}', mailbox='{self.mailbox}', is_delete='{self.is_delete}'
)>
"""
上述代码中是创建表结构的一些信息,主要是运用了sqlalchemy中提供的一些方法。这个网上教程很多,可自行百度了解下。
Alembic迁移表结构
表结构代码编写完成后,然后就是来迁移表结构到数据库中,这里我们使用alembic来迁移表结构。
首先使用 pip 安装 alembic ,代码如下:
(venv) PS E:\github_codes\codes\fastapi-back-end-test> pip install alembic -i https://pypi.douban.com/simple/
其次 alembic 安装完成后,然后进入到工程目录下的 src下,运行 alembic init alembic 命令,代码如下:
(venv) PS E:\github_codes\codes\fastapi-back-end-test\src> alembic init alembic
Creating directory E:\github_codes\codes\fastapi-back-end-test\src\alembic ... done
Creating directory E:\github_codes\codes\fastapi-back-end-test\src\alembic\versions ... done
Generating E:\github_codes\codes\fastapi-back-end-test\src\alembic.ini ... done
Generating E:\github_codes\codes\fastapi-back-end-test\src\alembic\env.py ... done
Generating E:\github_codes\codes\fastapi-back-end-test\src\alembic\README ... done
Generating E:\github_codes\codes\fastapi-back-end-test\src\alembic\script.py.mako ... done
Please edit configuration/connection/logging settings in 'E:\\github_codes\\codes\\fastapi-back-end-test\\src\\alembic.ini' before proceeding.
最后在命令运行完成后,在 src 下会生成一个 alembic 工程目录和一个 alembic.ini 。
配置alembic中的文件
首先要先去 alembic.ini 文件中找到 sqlalchemy.url 变量,然后把值换成自己的数据库连接信息(ps:如果是mysql数据库,一定要先建好数据库。),数据库连接信息格式如下:
sqlalchemy.url=mysql+pymysql://root:123456@10.10.12.199:3307/back_end
其次在 alembic 目录中找到 env.py 文件,导入 core 模块中 db 模块中的 base.py 和 models 模块中的 models_user.py。具体导包如下:
from src.app.models.models_plan import Plan
from src.app.models.models_user import User
from src.app.models.models_case import Case
from src.app.models.models_report import (
Report, ReportRecord
)
from src.app.core.db.base import Base
from logging.config import fileConfig
from sqlalchemy import engine_from_config
from sqlalchemy import pool
import os
import sys
from alembic import context
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(os.path.split(rootPath)[0])
# from src.app.core.db.base import Base
# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config
# 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
# target_metadata = None
target_metadata = Base.metadata
最后记得把变量 target_metadata 的值修改为 Base.metadata,这样脚本运行的时候会找到我们关联的数据库模型。
开始同步表结构
首先再次进入到工程目录 src 下,然后运行 alembic revision --autogenerate -m 命令,代码如下:
(venv) PS E:\github_codes\codes\fastapi-back-end-test\src> alembic revision --autogenerate -m "提交表结构"
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.autogenerate.compare] Detected added table 'users'
INFO [alembic.autogenerate.compare] Detected added index 'ix_users_id' on '['id']'
Generating E:\github_codes\codes\fastapi-back-end-test\src\alembic\versions\ea2f23976842_提交表结构.py ... done
其次运行完毕后,alembic目录下的versions目录下会出现一条提交记录,打开提交记录的.py文件,会看到以下代码(如无代码,则是没有需要更新的东西,或者配置有误):
"""提交表结构
Revision ID: ea2f23976842
Revises:
Create Date: 2023-06-01 18:02:56.447388
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'ea2f23976842'
down_revision = None
branch_labels = None
depends_on = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('user',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('mobile', sa.String(length=20), nullable=True),
sa.Column('username', sa.String(length=20), nullable=True),
sa.Column('password', sa.String(length=50), nullable=True),
sa.Column('mailbox', sa.String(length=100), nullable=True),
sa.Column('is_delete', sa.Boolean(), nullable=True),
sa.Column('created_time', sa.TIMESTAMP(), nullable=False),
sa.Column('updated_time', sa.TIMESTAMP(), nullable=False),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_users_id'), 'user', ['id'], unique=False)
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f('ix_users_id'), table_name='users')
op.drop_table('users')
# ### end Alembic commands ###
然后再执行 alembic upgrade head 命令往指定数据库更新表结构,代码如下:
(venv) PS E:\github_codes\codes\fastapi-back-end-test\src> alembic upgrade head
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> ea2f23976842, 提交表结构
最后数据库连接Navicat进行界面查看,会生成 alembic_version 和 users 表结构。
最后: 为了回馈铁杆粉丝们,我给大家整理了完整的软件测试视频学习教程,朋友们如果需要可以自行免费领取【保证100%免费】
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。