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