【发布时间】:2019-03-10 17:59:57
【问题描述】:
我是 so alembic 的新手,所以我可能会错过它的概念,但这是问题所在。
我在这样的烧瓶应用中有一些 sqlalchemy 表:
class Data(Base):
__tablename__ = 'Data'
__table_args__ = {'schema': 'schema'}
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
我初始化我的表:
Base = declarative_base()
engine = create_engine(db_link, pool_size=100, max_overflow=0)
Base.metadata.create_all(engine)
Session = sessionmaker()
Session.configure(bind=engine)
到那时,我在我的数据库中手动创建了表,并且一切正常。 为了以后让我的项目富有成效,我希望能够使用 alembic 迁移我的数据库。因为我将使用的一些表(在不同的模式中)是只读的并且是由另一个程序创建的,所以我只想迁移一些 sqlalchemy 表。因此我的升级脚本看起来像(由 alembic revision --autogenerate 创建):
revision = 'bb1d39b7eee1'
down_revision = None
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('Data',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('name', sa.String(), nullable=False),
sa.PrimaryKeyConstraint('id'),
schema='schema'
)
...
当我现在使用空数据库将架构迁移到时:
alembic upgrade head
我收到以下错误:
sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42S01', "[42S01] [M
icrosoft][SQL Server Native Client 11.0][SQL Server]There is already an object n
amed 'Data' in the database. (2714) (SQLExecDirectW)") [SQL: '\nCREATE TABLE schema.
[Data] (\n\tid INTEGER NOT NULL IDENTITY(1,1), \n\tname VARCHAR(max) NOT NULL, \
\n\tPRIMARY KEY (id), \n\tCHECK (IN (0, 1))\n)\n\n']
看起来 alembic 会自动创建所有表,然后再次尝试在我的修订脚本中创建这些表。如果那是真的,我怎么能告诉 alembic 不要自动创建任何表而只运行我创建的脚本?
【问题讨论】:
-
你已经在数据库上创建了多少张表?如果数量较少,您可以通读自动生成的 alembic 迁移脚本并删除已创建的
create_table条目。然后运行升级 -
在哪里可以找到该脚本?您是在谈论修订脚本(在版本文件夹中)吗?我的问题是,alembic 在运行该脚本之前会创建我在 sqlalchemy 中拥有的所有表。
-
即使我尝试在新创建的完全空的数据库上运行升级头,我也得到了“试图从问题中创建所有已存在的表错误”
标签: python flask sqlalchemy alembic