2017-08-15 10 views
1

Alembic beginner here。私は既に作成されたテーブルを削除しようとするAlembicにいくつかの問題があります。私は何が起こっているのか分かりません。私はalembic upgrade headを実行した場合、私は私の結果としてこれを取得テーブルを削除しようとしているAlembic

enter image description here

INFO [alembic.runtime.migration] Context impl PostgresqlImpl. 
INFO [alembic.runtime.migration] Will assume transactional DDL. 

私はalembic historyを実行した場合、私はこの結果を取得するには、どの今私はこのようになりますデータベースを持っています

c2659db918a9 -> 765c30f7078c (head), creat table views 
c4a0cac54f89 -> c2659db918a9, Made last_update not null for all tables 
19dd9f3d1d16 -> c4a0cac54f89, Added last_update field defaulted to now 
77c03ebb393b -> 19dd9f3d1d16, Added indexes to each table 
0737825277d8 -> 77c03ebb393b, Change foreign key columns to non-nullable 
5eb3c5f7f599 -> 0737825277d8, Rename a column in daily_etf_underlying table 
0da0b2a43172 -> 5eb3c5f7f599, Add extra_info column to daily_etf_underlying 
c181fe8bcfa9 -> 0da0b2a43172, Make daily_etf id columns nullable 
8fba2675104b -> c181fe8bcfa9, added fixing table 
074563d69c3b -> 8fba2675104b, Modify daily_etf tables 
2c9de57e43f0 -> 074563d69c3b, Add fund_family columns 
80de6fb0a104 -> 2c9de57e43f0, Modify daily_etf table 
a970af9bb117 -> 80de6fb0a104, Add daily_etf_basket, daily_etf_fx_forward tables 
<base> -> a970af9bb117, Add daily_etf table 

しかし、私はalembic revision --autogenerate -m "<>"を実行した場合、私はこれを取得:正しいです!

alembic revision --autogenerate -m "Raw fidessa client trade table" 
INFO [alembic.runtime.migration] Context impl PostgresqlImpl. 
INFO [alembic.runtime.migration] Will assume transactional DDL. 
INFO [alembic.ddl.postgresql] Detected sequence named 'daily_etf_fx_forward_id_seq' as owned by integer column 'daily_etf_fx_forward(id)', assuming SERIAL and omitting 
INFO [alembic.autogenerate.compare] Detected removed table 'daily_etf_fx_forward' 
INFO [alembic.autogenerate.compare] Detected removed table 'daily_etf' 
INFO [alembic.ddl.postgresql] Detected sequence named 'daily_fx_fixing_rate_id_seq' as owned by integer column 'daily_fx_fixing_rate(id)', assuming SERIAL and omitting 
INFO [alembic.autogenerate.compare] Detected removed table 'daily_fx_fixing_rate' 
INFO [alembic.ddl.postgresql] Detected sequence named 'daily_etf_underlying_id_seq' as owned by integer column 'daily_etf_underlying(id)', assuming SERIAL and omitting 
INFO [alembic.autogenerate.compare] Detected removed table 'daily_etf_underlying' 
Generating C:\dev\Projects\stark_database\stark_database\migrations\versions\86174c06e59e_raw_fidessa_client_trade_table.py ... done 

そして、私の自動生成されたファイルには、ちょうど私のすべてのテーブルを削除しようとしている:(

def upgrade(): 
    # ### commands auto generated by Alembic - please adjust! ### 
    op.drop_table('daily_fx_fixing_rate') 
    op.drop_table('daily_etf_underlying') 
    op.drop_table('daily_etf') 
    op.drop_table('daily_etf_fx_forward') 
    # ### end Alembic commands ### 

ここで何が起こっているか?なぜアレンビックはすべてを削除しようとしている?あなたの助けのための

感謝を。

EDIT:alembic.ini

[alembic] 
script_location = migrations 
sqlalchemy.url = postgresql://stark_admin:[email protected]/stark 

env.pyは、私は考え出しalembic init alembic

+0

どのようにあなたのテーブルのメタデータとalembic構成ですか? –

+0

編集を参照してください。ありがとうございましたIlja – coolboyjules

+2

あなたのテーブルメタデータを指すようにenv.pyの 'target_metadata = None'を置き換えましたか? –

答えて

2

に正確に教科書です。 metadataオブジェクトが正しくありませんでした。 、

を読んだ人のために

あなたはtarget_metadata = metadataで正しいmetadataを持っていることを確認してください。コメントが示唆しているように、データベースにすでにテーブルがあり、新しいmetadataまたはNoneメタデータをIljaとして指定すると、この動作が表示されます。これは、alembicがそのメタデータに基づいて、それらを削除しようとします。

さらに、通常、SQLAlchemyの異なるファイルにクラスがあります。これを行うには、ファイル全体で同じmetadataまたはBaseインスタンスを使用していることを確認する必要があります。そうしないと、テーブルを検出しない、または既存のテーブルを削除しようとするこの動作が発生します。ここで

は後者の状況の例です:

は私が__init__.py

database 
    /migrations 
     /versions 
      1348ht31r3_first_migration.py 
     env.py 
     README 
     script.py.mako 
    /models 
     __init__.py 
     a_class.py 

のような構造を持っていると仮定し、私は典型的なdeclarative_base()の操作を行います。

a_class.py
# __init__.py 
from sqlalchemy import create_engine 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 
engine = create_engine('url') 

そして、私は母クラスがベースである私のモデルクラスを持っています__init__.pyから

from datetime import datetime 

from sqlalchemy import Column, Integer, String, Float 
from sqlalchemy import Date, DateTime 
from sqlalchemy import ForeignKey 
from sqlalchemy.dialects.postgresql import JSONB 
from sqlalchemy.orm import relationship 

from stark_database.models import Base 


class AClass(Base): 
    __tablename__ = 'a_class' 
    id = Column(Integer, primary_key=True) 
    insert_date = Column(Date) 
    symbol = Column(String) 
    pnu = Column(Float) 
    projected_shares_outstanding = Column(Float) 
    shares_outstanding = Column(Float) 
    projected_nav = Column(Float) 
    nav = Column(Float) 
    basket_cash_per_currency = Column(JSONB) 
    fund_cash_per_currency = Column(JSONB) 
    info_type = Column(String) 
    fund_family = Column(String) 
    last_updated = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now) 

これは正しいですが、env.pyに、あなたは基本クラスモデルをインポートを確認する必要があります。

from __future__ import with_statement 

import os 
import sys 
from logging.config import fileConfig 

from alembic import context 
from sqlalchemy import engine_from_config, pool 

# DO NOT DELETE THIS LINE. 
from database.models import Base, a_class 

これはalembicものではありませんが、それは私の意見では、Pythonの落とし穴のビットです。

これが役に立ちます。

+1

件名に関する関連ドキュメント:http://alembic.zzzcomputing.com/en/latest/autogenerate.html –

関連する問題