我正在构建一个 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)