Flask: Datenbank definition in einer anderen Datei

Django, Flask, Bottle, WSGI, CGI…
Antworten
friedduck
User
Beiträge: 76
Registriert: Montag 23. Juli 2012, 20:41

Hallo,

habe gestern bis in die Pupen probiert, aber ich bekomme es nicht hin meine Datenbank definitionen in eine
andere Datei auszulagern. Ich weiß nicht was ich Importieren soll.

Hat jemand nen Tipp?

Beispiel (nur ein kurzer ausschnitt):
main.py

Code: Alles auswählen

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

app = Flask(__name__)
db = SQLAlchemy(app)
db.py

Code: Alles auswählen

from main import db

class Datenbank(db.Model):
 wert1 = db.Column...
 u.s.w

db.create.all()
Die Datenbank wird nicht ertstellt und wenn ich die händisch anlege, kann ich aus der main.py keine querys absetzen...
friedduck
User
Beiträge: 76
Registriert: Montag 23. Juli 2012, 20:41

Zu schwer?
BlackJack

@friedduck: Zu wenig Information‽ Versuchst Du da vielleicht einen zirkulären Import? Das ist eine ganz schlechte Idee.
friedduck
User
Beiträge: 76
Registriert: Montag 23. Juli 2012, 20:41

Versuchst Du da vielleicht einen zirkulären Import? Das ist eine ganz schlechte Idee.
Sowas versuche ich ja grade zu vermeiden.
Was brauchst du an Info?

Ich will doch einfach nur mein Datenbank modell in eine andere Datei ausgliedern, wegen der Übersicht.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Statt die SQLAlchemy Instanz in main.py zu erzeugen, erzeuge sie in db.py und in main.py importierst du dann einfach die SQLAlchemy Instanz und rufst `.init_app()` mit der `app` auf anstatt `SQLAlchemy()` mit der `app` aufzurufen.

Das erlaubt dir dann auch die Datenbank in unterschiedlichen Flask Anwendungen zu nutzen.
friedduck
User
Beiträge: 76
Registriert: Montag 23. Juli 2012, 20:41

@DasIch: Hi, ich bin mir sicher das deine Lösung funktioniert aber ich habe es gestern, bevor ich deinen Post gelesen hab,
über __init__.py hinbekommen. Kann es da irgendwelche "nebenwirkungen" geben?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Die Anwendung sollte in etwa so aussehen https://gist.github.com/DasIch/5685500. Ich hab dabei angenommen das db.py und app.py in einem package sind.
friedduck
User
Beiträge: 76
Registriert: Montag 23. Juli 2012, 20:41

Hi meine jetzige Lösung sieht so aus:
__init__.py:

Code: Alles auswählen

# -*- coding: utf-8 -*-

from flask import Flask, redirect, url_for, flash, abort, request, session

from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)

app.config.from_object('server_config')

db = SQLAlchemy(app)

#from src import main
from src import server_db
from src import server_views
server_db.py:

Code: Alles auswählen

# -*- coding: utf-8 -*-

from src import db

#===============================================================================
# Tabellen definieren
#===============================================================================

class BLA(db.Model):
    id = db.Column(db.Integer, primary_key = True)
funktioniert auch gut.

Die Anregung ist von diesem Tut: http://blog.miguelgrinberg.com/post/the ... ello-world
BlackJack

@friedduck: `src` ist ein schlechter Name für ein Package. Das sieht nach einer fehlgeleiteten Verwendung des üblichen Namensschemas bei Projektverzeichnisstrukturen aus. In dem Verzeichnis ``src/`` liegt oft der Quelltext, das Verzeichnis selbst ist aber nicht dazu da um zum Package gemacht zu werden. Packages liegen *in* dem Verzeichnis und haben *sinnvolle* Namen.

Wie befürchtet hast Du es jetzt mit einem zirkulären Import gemacht. Das ist undurchsichtig, fehleranfällig, und unnötig kompliziert. Wenn sich zwei Module gegenseitig benötigen sind sie entweder so eng gekoppelt, dass es keinen Sinn macht sie aufzuteilen, oder die Aufteilung ist falsch vorgenommen worden.
friedduck
User
Beiträge: 76
Registriert: Montag 23. Juli 2012, 20:41

Danke für die Auskunft BlackJack, mit src haste recht, werde mich bessern :-)
Wie befürchtet hast Du es jetzt mit einem zirkulären Import gemacht.
War nicht meine Absicht, ich will schlechten Design vermeiden, deswegen frage ich ja fast wegen jeden pups nach.
Bin ja noch dabei Python zu verinnerlichen...

Ist das das Beispiel von Dasich ok, oder hast du da noch eine Verbesserung?

Und apropos Python verinnerlichen, willst du nicht mal ein Tutorial zu OOP schreiben, ich wette du wirst es gut erklären können,
so das auch die Einsteiger (wie ich) gut damit zurecht kommen werden.

Das ist mein nächstes Angriffsziel...
friedduck
User
Beiträge: 76
Registriert: Montag 23. Juli 2012, 20:41

@DasIch:
habe meine Beispiele nach deiner Metode umgestrickt, beim aufruf von db.create_all() bekomme ich die
Fehlermeldung:

Code: Alles auswählen

raise RuntimeError('application not registered on db '
RuntimeError: application not registered on db instance and no application bound to current contex
Einde Idee?
friedduck
User
Beiträge: 76
Registriert: Montag 23. Juli 2012, 20:41

Habe den Quellcode folgend ergänzt:
db.app = app
friedduck
User
Beiträge: 76
Registriert: Montag 23. Juli 2012, 20:41

Hmm es läuft jetzt, aber warum? Es scheint fast so als ob Flask nicht weiß welche app instanz er db zuweisen soll.
Ist so still hier, benutzt denn keiner Flask?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Es kann mehrere App Instanzen geben deswegen kann man da keine magischen Zuweisungen geben, deswegen haben Extensions üblicherweise eine .init_app() Methode oder nutzen den app context.

Keine Ahnung wie viele hier Flask nutzen aber du wirst wesentlich mehr Nutzer und Flask Entwickler auf der Flask Mailingliste oder im #pocoo IRC Channel finden, da ist es auch nicht ganz so still ;)
friedduck
User
Beiträge: 76
Registriert: Montag 23. Juli 2012, 20:41

DasIch hat geschrieben:Keine Ahnung wie viele hier Flask nutzen aber du wirst wesentlich mehr Nutzer und Flask Entwickler auf der Flask Mailingliste oder im #pocoo IRC Channel finden, da ist es auch nicht ganz so still ;)
Stimmt :D
Es kann mehrere App Instanzen geben deswegen kann man da keine magischen Zuweisungen geben, deswegen haben Extensions üblicherweise eine .init_app() Methode oder nutzen den app context.
Ok, funktioniert dein Bespiel denn bei Dir? Ich habs ja genauso gemacht wie du, deswegen wundert es mich. Bin grade bei Flask (Homepage) am lesen, Armin
emfiehlt ja die Blueprints zu benutzen.
Antworten