Flask Migrate

Django, Flask, Bottle, WSGI, CGI…
Antworten
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Im Beispiel liegen die Modelle direkt im Migrationsscript:
https://flask-migrate.readthedocs.org/en/latest/

Da das eigentlich nicht üblich ist: Wie geht man vor, wenn die Modelle in einem Modul liegen?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Wenn du den Import `from other_module import User` hinzufuegst, kommst du genau zu der Situation wie sie im Beispiel besteht.

Es kommt mir aber jetzt nicht so vor, dass das Beispiel der Normalfall ist, schliesslich will man die neuen Models ja zukuenftig benutzen.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hallo Cofi

Das habe ich drin:

import x.models

Funktioniert aber nicht, die Tabellen die schon in der DB stehen, werden als zum Löschen vorgesehen ins Migrationsscipt übernommen. Also scheint das irgendwie noch nicht zu genügen. Ja, ein praktischeres Beispiel wäre toll.
BlackJack

@meego: Und wenn Du die Models importierst statt nur das Modul welches die Models enthält?
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Also so wie Cofi oben sagt, jede einzelne Class namentlich in die Symboltabelle importieren?
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

MIt python manage.py db show erhalte ich folgendes angezeigt:

Code: Alles auswählen

Rev: 39b3858b84a (head)
Parent: <base>
Path: /home/nuc/Dropbox/J/migrations/versions/39b3858b84a_.py

    empty message
    
    Revision ID: 39b3858b84a
    Revises: None
    Create Date: 2015-12-03 11:26:29.591292
Der Ordner scheint aber leer. Kann man die Version nicht einfach löschen?

Wenn ich das ganze mit python manage.py db upgrade ausführen will, kommen Fehlermeldungen.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Das File konnte ich mittlerweile löschen. Wenn ich aber mit Alembic upgraden will erhalte ich:
https://gist.github.com/muroshi/44620993540d5bde299c
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Okay, flask-migrate will die Tabellen immer noch nicht übernehmen. (Könnte irgendwie mit den MetaKlasseninfos zu tun haben, meinte jedenfalls jemand auf sqlalchemy).

Meine manage.py:

Code: Alles auswählen

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask.ext.script import Manager
from flask.ext.migrate import Migrate, MigrateCommand
import J.models

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql:///mydatabase'
db = SQLAlchemy(app)

migrate = Migrate(app, db)

manager = Manager(app)

manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
	manager.run()
Bash:

Code: Alles auswählen

>>> dir(manage)
['Flask', 'J', 'Manager', 'Migrate', 'MigrateCommand', 'SQLAlchemy', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'app', 'db', 'manager', 'migrate']
>>> dir(manage.J)
['Admin', 'Country', 'Flask', 'Floor', 'J', 'ModelView', 'PropertyListingType', 'PublicationPeriod', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'admin', 'app', 'configuration', 'db', 'forms', 'models', 'views']
>>> dir(manage.J.models)
['Country', 'Distance', 'Floor', 'Image', 'PropertyListing', 'PropertyListingSubtype', 'PropertyListingType', 'PublicationPeriod', 'RentUnit', 'SaleOrLease', 'SaleUnit', 'Salutation']
Der Vollständigkeit halber noch __init__.py (die aber eigentlich keine Rolle spielen sollte):

Code: Alles auswählen

from flask import Flask
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView

app = Flask(__name__)

import J.views
from J.models import Country, PropertyListingType, Floor, PublicationPeriod
from J.db import db

app.config.from_object('J.configuration')
db.init_app(app)

# Creating Administrator interface ::
admin = Admin(app, template_mode='bootstrap3')
# Administrative views ::
admin.add_view(ModelView(Country, db.session))
admin.add_view(ModelView(PropertyListingType, db.session))
admin.add_view(ModelView(Floor, db.session))
admin.add_view(ModelView(PublicationPeriod, db.session))

if __name__ == '__main__':
    app.run()
Tree:

Code: Alles auswählen

.
├── J
│   ├── configuration.py
│   ├── db.py
│   ├── forms.py
│   ├── __init__.py
│   ├── models.py
│   ├── static
│   │   ├── css
│   │   ├── font
│   │   └── js
│   ├── templates
│   │   ├── advertise.html
│   └── views.py
├── manage.py
├── migrations
│   ├── alembic.ini
│   ├── env.py
│   ├── README
│   ├── script.py.mako
│   └── versions
├── __pycache__
│   └── manage.cpython-34.pyc
├── requirements.txt
├── runserver.py
└── venv
Antworten