Flask-Migrate是否处理手动定义的序列?

时间:2017-08-02 05:51:34

标签: python-3.x sqlalchemy flask-sqlalchemy alembic flask-migrate

我正在建立一个flask-sqlalchemy数据模型,并成功创建了表并将数据添加到数据库中的表中。我最近决定在应用程序中包含Flask-Migrate,以便我可以方便地跟踪更改。

使用Flask-Migrate和Flask-Script Manager我成功地使用

初始化数据库
python model.py db init

并且能够使用

创建迁移
python model.py db migrate

但似乎Flask-Migrate不知道如何处理手动声明的序列,因为当我运行时

python model.py db upgrade

我遇到了

psycopg2.ProgrammingError: relation "seq_inbox" does not exist

seq_inbox 是我手动声明的序列的名称。

在migrations / versions目录中检查创建的迁移后,我看到了这个

def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('inbox',
sa.Column('inbox_id', sa.Integer(), server_default=sa.text("nextval('seq_inbox')"), nullable=False),
sa.Column('message_title', sa.String(length=60), server_default='n/a', nullable=False),
sa.Column('first_name', sa.String(length=30), server_default='n/a', nullable=False),
sa.Column('last_name', sa.String(length=30), server_default='n/a', nullable=False),
sa.Column('email', sa.String(length=60), nullable=False),
sa.Column('phone_number', sa.String(length=60), server_default='n/a', nullable=False),
sa.Column('message', sa.String(length=1000), server_default='n/a', nullable=False),
sa.PrimaryKeyConstraint('inbox_id')
)

在我看来,Alembic将我的序列名称解释为纯文本,这是正确的吗?

我如何解决这个问题"关系不存在"错误?

编辑1 当我删除序列声明并重置所​​有内容时,我能够顺利运行升级命令。但我希望我的命名序列存在。

编辑2 运行python models.py db upgrade

后出现错误
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade  -> fb6c667b4492, empty message
Traceback (most recent call last):
  File "C:\Users\Flashspeed\AppData\Local\Programs\Python\Python35\lib\site-packages\sqlalchemy\engine\base.py", line 1182, in _execute_context
    context)
  File "C:\Users\Flashspeed\AppData\Local\Programs\Python\Python35\lib\site-packages\sqlalchemy\engine\default.py", line 470, in do_execute
    cursor.execute(statement, parameters)
psycopg2.ProgrammingError: relation "seq_inbox" does not exist

编辑3 这是收件箱模型本身

class Inbox(db.Model):
    __tablename__ = "inbox"

    inbox_sequence = db.Sequence(name="seq_inbox", start=1, increment=1, metadata=metadata)

    inbox_id     = db.Column(db.Integer(), inbox_sequence, server_default=inbox_sequence.next_value(), primary_key=True)
    title        = db.Column(db.String(60),   server_default=missingString, nullable=False)
    first_name   = db.Column(db.String(30),   server_default=missingString, nullable=False)
    last_name    = db.Column(db.String(30),   server_default=missingString, nullable=False)
    email        = db.Column(db.String(60),   nullable=False)
    phone_number = db.Column(db.String(60),   server_default=missingString, nullable=False)
    message      = db.Column(db.String(1000), server_default=missingString, nullable=False)

0 个答案:

没有答案