2013-03-27 15 views
14

Ich versuche Alembic zum ersten Mal zu verwenden und wollen --autogenerate Funktion here beschrieben verwendenAlembic --autogenerate leer Migration Herstellung

Meine Projektstruktur sieht aus wie

project/ 
     configuration/ 
        __init__.py 
        dev.py 
        test.py 
     core/ 
      app/ 
       models/ 
        __init__.py 
        user.py 
     db/ 
      alembic/ 
        versions/ 
        env.py 
      alembic.ini 

Ich bin mit Flask und SQLAlchemy und ihre Flask-SQLAlchemy Erweiterung. mein Modell User sieht aus wie

class User(UserMixin, db.Model): 
    __tablename__ = 'users' 
    # noinspection PyShadowingBuiltins 
    uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True, 
        unique=True) 
    email = Column('email', String, nullable=False, unique=True) 
    _password = Column('password', String, nullable=False) 
    created_on = Column('created_on', sa.types.DateTime(timezone=True), 
         default=datetime.utcnow()) 
    last_login = Column('last_login', sa.types.DateTime(timezone=True), 
         onupdate=datetime.utcnow()) 

Wie here beschrieben, modifizierte ich env.py wie

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 
import dev 


app = Flask(__name__) 
app.config.from_envvar('SETTINGS_PT') 
db = SQLAlchemy(app) 
wie

aussehen
from configuration import app 

alembic_config = config.get_section(config.config_ini_section) 
alembic_config['sqlalchemy.url'] = app.config['SQLALCHEMY_DATABASE_URI'] 
engine = engine_from_config(
    alembic_config, 
      prefix='sqlalchemy.', 
      poolclass=pool.NullPool) 

und

from configuration import db 


target_metadata = db.metadata 

wo configuration.__init__py aussieht Nun

wenn ich laufe Migration

$alembic revision --autogenerate -m "Added user table" 
INFO [alembic.migration] Context impl PostgresqlImpl. 
INFO [alembic.migration] Will assume transactional DDL. 
    Generating /Users/me/IdeaProjects/project/db/alembic/versions/55a9d5 
    35d8ae_added_user_table.py...done 

aber Datei alembic/versions/55a9d5 leer upgrade() und downgrade() Methoden

"""Added user table 

Revision ID: 1b62a62eef0d 
Revises: None 
Create Date: 2013-03-27 06:37:08.314177 

""" 

# revision identifiers, used by Alembic. 
revision = '1b62a62eef0d' 
down_revision = None 

from alembic import op 
import sqlalchemy as sa 


def upgrade(): 
    ### commands auto generated by Alembic - please adjust! ### 
    pass 
    ### end Alembic commands ### 


def downgrade(): 
    ### commands auto generated by Alembic - please adjust! ### 
    pass 
    ### end Alembic commands ### 

hat Wie kommt es nicht in der Lage zu verstehen, dass es ein neues ist User Modell? Bitte helfen

+5

Ihr Alembic env.py muss sicherstellen, dass das Benutzermodell importiert wurde, so dass die Tabelle im Speicher vorhanden ist, wenn Migrationen ausgeführt werden. – zzzeek

+0

Das war es!Vielen Dank für Ihre Hilfe Michael – daydreamer

+0

Kann nützlich sein: Wenn leere Migrationen generiert werden, nachdem Sie die Spalte aktualisiert haben, überprüfen Sie diese Antwort http://stackoverflow.com/a/17176843/1339254 – alexche8

Antwort

16

Per @zzzeek, ​​nachdem ich in meinem env.py folgendes enthalten ist, konnte ich mit --autogenerate Option arbeiten

in env.py unter run_migrations_online()

from configuration import app 
from core.expense.models import user # added my model here 

alembic_config = config.get_section(config.config_ini_section) 
alembic_config['sqlalchemy.url'] = app.config['SQLALCHEMY_DATABASE_URI'] 
engine = engine_from_config(
    alembic_config, 
    prefix='sqlalchemy.', 
    poolclass=pool.NullPool) 

dann lief ich alembic revision --autogenerate -m "Added initial table" und bekam

def upgrade(): 
    ### commands auto generated by Alembic - please adjust! ### 
    op.create_table('users', 
    sa.Column('uuid', sa.GUID(), nullable=False), 
    sa.Column('email', sa.String(), nullable=False), 
    sa.Column('password', sa.String(), nullable=False), 
    sa.Column('created_on', sa.DateTime(timezone=True), nullable=True), 
    sa.Column('last_login', sa.DateTime(timezone=True), nullable=True), 
    sa.PrimaryKeyConstraint('uuid'), 
    sa.UniqueConstraint('email'), 
    sa.UniqueConstraint('uuid') 
    ) 
    ### end Alembic commands ### 

Vielen Dank Michael für alle Ihre h elp!

0

Ich denke, es ist erwähnenswert, dass ich das gleiche Problem in der aktuellen Version (0.8.4) hatte, aber die Methode zum Festlegen von Metadaten scheint expliziter geworden zu sein: Zusätzlich zum Importieren eines Modells müssen Sie Stellen Sie auch target_metadata ein (das in env.py vorhanden ist, aber standardmäßig None ist).

Die documentation schlägt vor, etwas zu importieren, das sie Base nannten, aber es ist nicht klar, was genau das ist; das Importieren der DeclarativeBase-Instanz, von der meine Modelle erben, hat für mich nichts bewirkt (dasselbe Ergebnis wie OP).

Die tatsächlichen Kommentare im Code schlagen jedoch vor, target_metadata mit einem tatsächlichen Modell (ModelNameHere.metadata), die für mich funktioniert hat (unter Verwendung der Metadaten eines Modells führte alle von ihnen erkannt werden).

Verwandte Themen