Alembic - sqlalchemy不检测现有表

Efr*_*rin 16 python sqlalchemy alembic

我已经问了一个关于如何通过使用检测表的问题(Alembic - sqlalchemy初始迁移)

target_metadata = Base.metadata
Run Code Online (Sandbox Code Playgroud)

对于

alembic revision --autogenerate -m "initial migration"
Run Code Online (Sandbox Code Playgroud)

在我将模型导入env.py文件之后,它似乎工作正常但它没有检测到实际存在的表,因此它创建了包含所有表的迁移文件,例如:

def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.create_table('Brand',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(), nullable=True),
    sa.Column('slug', sa.String(), nullable=True),
    sa.Column('date_created', sa.DateTime(), nullable=True),
    sa.Column('date_updated', sa.DateTime(), nullable=True),
    sa.PrimaryKeyConstraint('id'),
    schema='Products'
    )

def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.drop_table('ProductFile', schema='Products')
Run Code Online (Sandbox Code Playgroud)

我试过了:

alembic stamp head
Run Code Online (Sandbox Code Playgroud)

但在运行并运行autogenerate命令后,系统再次生成所有模型.

from project.apps.users.models import *
from project.apps.orders.models import *
from project.apps.products.models import *

from project.base import Base, metadata

# 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.
fileConfig(config.config_file_name)

# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
target_metadata = Base.metadata
Run Code Online (Sandbox Code Playgroud)

我该如何避免这个问题?

编辑:

ENV.py:

https://gist.github.com/pypetey/bb65807ce773d8baeaf1
Run Code Online (Sandbox Code Playgroud)

我删除了数据库并进行了迁移

(env) D:\projekty\test>alembic revision --autogenerate
INFO  [alembic.migration] Context impl MSSQLImpl.
INFO  [alembic.migration] Will assume transactional DDL.
INFO  [alembic.autogenerate.compare] Detected added table u'Users.Country'
INFO  [alembic.autogenerate.compare] Detected added table u'Products.Brand'
INFO  [alembic.autogenerate.compare] Detected added table u'Users.User'
INFO  [alembic.autogenerate.compare] Detected added table u'Products.Product'
INFO  [alembic.autogenerate.compare] Detected added table u'Products.ProductFile
'
INFO  [alembic.autogenerate.compare] Detected added table u'Orders.Order'
INFO  [alembic.autogenerate.compare] Detected added table u'Products.Category'
INFO  [alembic.autogenerate.compare] Detected added table u'Products.Review'
INFO  [alembic.autogenerate.compare] Detected added table u'Users.UserAddress'
INFO  [alembic.autogenerate.compare] Detected added table u'Orders.OrderItem'
INFO  [alembic.autogenerate.compare] Detected added table u'Orders.OrderStatus'
Generating D:\projekty\test\alembic\versions\1c6337c144a7_.py ... done

(env) D:\projekty\test>alembic upgrade head
INFO  [alembic.migration] Context impl MSSQLImpl.
INFO  [alembic.migration] Will assume transactional DDL.
INFO  [alembic.migration] Running upgrade None -> 1c6337c144a7, empty message

(env) D:\projekty\test>alembic revision --autogenerate
INFO  [alembic.migration] Context impl MSSQLImpl.
INFO  [alembic.migration] Will assume transactional DDL.
INFO  [alembic.autogenerate.compare] Detected added table u'Users.Country'
INFO  [alembic.autogenerate.compare] Detected added table u'Products.Brand'
INFO  [alembic.autogenerate.compare] Detected added table u'Users.User'
INFO  [alembic.autogenerate.compare] Detected added table u'Products.Product'
INFO  [alembic.autogenerate.compare] Detected added table u'Products.ProductFile
'
INFO  [alembic.autogenerate.compare] Detected added table u'Orders.Order'
INFO  [alembic.autogenerate.compare] Detected added table u'Products.Category'
INFO  [alembic.autogenerate.compare] Detected added table u'Products.Review'
INFO  [alembic.autogenerate.compare] Detected added table u'Users.UserAddress'
INFO  [alembic.autogenerate.compare] Detected added table u'Orders.OrderItem'
INFO  [alembic.autogenerate.compare] Detected added table u'Orders.OrderStatus'
Generating D:\projekty\test\alembic\versions\5abb204549f_.py ... done
Run Code Online (Sandbox Code Playgroud)

小智 21

我有同样的问题 - 我不知道它是否仍会影响你.对我来说,问题是由于我使用的模式不是默认的 - 我认为同样的事情发生在你身上,因为你正在使用"产品"模式.我发布了一个问题:

https://bitbucket.org/zzzeek/alembic/issue/281/autogenerate-fails-to-detect-existing

通过一些指导,设法通过设置alembic/env.py模块include_schemas=True中的两个run_migrations_*函数来解决问题.

查看文档:

如果为True,则autogenerate将扫描SQLAlchemy get_schema_names()方法所定位的所有模式,并包括在所有这些模式中找到的表中的所有差异.使用此选项时,您可能还希望使用EnvironmentContext.configure.include_object 选项来指定可以过滤包含的表/模式的可调用对象.

  • 谢谢,伙计,您的旧答案仍然可以挽救人们的生命! (5认同)

Hen*_*l B 6

我有一个观察。
导入到env.pyalembic 中的元数据必须具有所有模型元数据。所以在调用Base之前必须加载所有模型。那么,
db_setup.py就会有,

...
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
...
Run Code Online (Sandbox Code Playgroud)

并且models.py将会有,

from .db_setup import Base
from sqlalchemy import Column, String
class TestModel(Base):
    __tablename__ = "test"
    field_1 = Column(String)
    ...
Run Code Online (Sandbox Code Playgroud)

现在,在main.py

from flask import Flask
...
from models.setup import Base
app = Flask(__name__)
...
Run Code Online (Sandbox Code Playgroud)

最后,在蒸馏器中env.py

...
...
from main import Base # Not from db_setup!
target_metadata = Base.metadata
...
...
Run Code Online (Sandbox Code Playgroud)