在使用FastAPI和SQLAlchemy时,可以通过以下步骤来解决Alembic在创建表时不生成迁移代码的问题:
确保你已经正确地设置了Alembic和SQLAlchemy。在项目的根目录下,创建一个名为alembic的文件夹,以及一个名为models的文件夹。
在alembic文件夹下创建一个名为env.py的文件,用于配置Alembic。
# alembic/env.py
from logging.config import fileConfig
from sqlalchemy import engine_from_config
from sqlalchemy import pool
from alembic import context
# 将models文件夹添加到sys.path中
import os
import sys
sys.path.append(os.getcwd())
# 导入SQLAlchemy的metadata和Base对象
from models import metadata, Base
# 从配置文件中读取数据库连接信息
config = context.config
fileConfig(config.config_file_name)
# 通过SQLAlchemy的配置创建一个数据库引擎
target_metadata = metadata
config.set_main_option('sqlalchemy.url', 'database_url')
def run_migrations_offline():
"""离线运行迁移"""
url = config.get_main_option("sqlalchemy.url")
context.configure(
url=url,
target_metadata=target_metadata,
literal_binds=True,
dialect_opts={"paramstyle": "named"},
user_module_prefix='sa.'
)
with context.begin_transaction():
context.run_migrations()
def run_migrations_online():
"""在线运行迁移"""
connectable = engine_from_config(
config.get_section(config.config_ini_section),
prefix='sqlalchemy.',
poolclass=pool.NullPool
)
with connectable.connect() as connection:
context.configure(
connection=connection,
target_metadata=target_metadata
)
with context.begin_transaction():
context.run_migrations()
if context.is_offline_mode():
run_migrations_offline()
else:
run_migrations_online()
models文件夹下创建一个名为__init__.py的文件,用于定义数据库模型。# models/__init__.py
from sqlalchemy import create_engine, MetaData
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 定义数据库连接URL
database_url = "sqlite:///./database.db"
# 创建数据库引擎
engine = create_engine(database_url)
# 创建元数据对象
metadata = MetaData(bind=engine)
# 创建Base对象
Base = declarative_base(bind=engine, metadata=metadata)
# 创建Session对象
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
models文件夹下创建一个名为example.py的文件,用于定义一个示例数据库模型。# models/example.py
from sqlalchemy import Column, Integer, String
from models import Base
class Example(Base):
__tablename__ = "examples"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
alembic init alembic
这将在alembic文件夹下创建一个名为alembic.ini的配置文件和一个名为versions的文件夹。
alembic.ini文件中,修改script_location的值为alembic文件夹的路径。# alembic.ini
[alembic]
script_location = alembic
alembic revision --autogenerate -m "init"
这将在versions文件夹下创建一个名为xxxx_init.py的迁移脚本。
# versions/xxxx_init.py
from alembic import op
import sqlalchemy as sa
def upgrade():
op.create_table(
'examples',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('name', sa.String(length=255), nullable=True),
sa.PrimaryKeyConstraint('id')
)
def downgrade():