2017-02-28 71 views
0

我想將對本地數據庫所做的更改應用到雲數據庫。難以通過燒瓶遷移升級我的臨時數據庫

我的本地數據庫有三個表,User,email_history,event_monitor。我刪除了本地遷移文件夾,然後運行python manage.py db initpython manage.py db migrate命令。

它創建一個修改文件,如下所示。

"""empty message 

Revision ID: 9bd307a576ce 
Revises: 
Create Date: 2017-03-01 00:10:32.344698 

""" 
from alembic import op 
import sqlalchemy as sa 
from sqlalchemy.dialects import mysql 

# revision identifiers, used by Alembic. 
revision = '9bd307a576ce' 
down_revision = None 
branch_labels = None 
depends_on = None 


def upgrade(): 
    # ### commands auto generated by Alembic - please adjust! ### 
    op.drop_table('user') 
    op.drop_table('email_history') 
    op.drop_table('event_monitor') 
    # ### end Alembic commands ### 


def downgrade(): 
    # ### commands auto generated by Alembic - please adjust! ### 
    op.create_table('event_monitor', 
    sa.Column('id', mysql.INTEGER(display_width=11), nullable=False), 
    sa.Column('event_type', mysql.VARCHAR(length=80), nullable=True), 
    sa.Column('event_description', mysql.TEXT(), nullable=True), 
    sa.PrimaryKeyConstraint('id'), 
    mysql_default_charset=u'latin1', 
    mysql_engine=u'InnoDB' 
    ) 
    op.create_table('email_history', 
    sa.Column('id', mysql.INTEGER(display_width=11), nullable=False), 
    sa.Column('user_id', mysql.INTEGER(display_width=11), autoincrement=False, nullable=False), 
    sa.Column('email_type', mysql.ENUM(u'SAMPLE'), nullable=True), 
    sa.Column('datetime_created', mysql.DATETIME(), nullable=True), 
    sa.Column('datetime_sent', mysql.DATETIME(), nullable=True), 
    sa.Column('status', mysql.TINYINT(display_width=1), autoincrement=False, nullable=False), 
    sa.ForeignKeyConstraint(['user_id'], [u'user.id'], name=u'email_history_ibfk_1', ondelete=u'CASCADE'), 
    sa.PrimaryKeyConstraint('id'), 
    mysql_default_charset=u'latin1', 
    mysql_engine=u'InnoDB' 
    ) 
    op.create_table('user', 
    sa.Column('id', mysql.INTEGER(display_width=11), nullable=False), 
    sa.Column('username', mysql.VARCHAR(length=80), nullable=True), 
    sa.Column('email', mysql.VARCHAR(length=120), nullable=False), 
    sa.Column('password_hash', mysql.VARCHAR(length=256), nullable=True), 
    sa.PrimaryKeyConstraint('id'), 
    mysql_default_charset=u'latin1', 
    mysql_engine=u'InnoDB' 
    ) 
    # ### end Alembic commands ### 

如果我做

export config=prod && python manage.py db upgrade 

sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (1051, "Unknown table 's2sdevdb.user'") [SQL: u'\nDROP TABLE user']錯誤。是的,我已經刪除了雲數據庫中的表格。

我的問題是,爲什麼遷移命令未能創建表創建的代碼?我如何完成這項任務?

回答

1

在本地,您刪除了您的遷移,但您的數據仍然存在。當您創建遷移時,Alembic會查看您的代碼並找到一些模型,查看數據庫並發現這些表仍然存在,因此不會生成用於創建表的代碼。

據推測,有代表其產生的壓降爲命令三個表不再車型。

要建立代表所有模型遷移,數據庫必須是空的。請刪除表或指向一個空的數據庫。 Alembic生成alembic_version表,您可能還需要刪除該表。


遠程,你放棄了表,然後試圖運行滴表遷移。它由於給定的原因而失敗:表格不存在被刪除。

既然你搞砸了,並手動進行遷移,用manage.py db stamp head告訴蒸餾器,你的數據庫已經代表了當前遷移。

假設你真的重置遠程數據庫,然後命令你表現出良好的運行新的移植作品。