1

我正在构建一个 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是我手动声明的序列的名称。

检查迁移/版本目录中创建的迁移后,我看到了这个

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)
4

0 回答 0