2015-05-08 8 views
9

Ich hatte einen kleinen Webdienst mit Flask und Flask-SQLAlchemy, die nur ein Modell enthielt. Ich möchte jetzt die gleiche Datenbank verwenden, aber mit einer Befehlszeilen-App, also möchte ich die Flask Abhängigkeit fallen lassen.Verwenden von Flask-SQLAlchemy ohne Flask

Mein Modell sieht wie folgt aus:

class IPEntry(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    ip_address = db.Column(db.String(16), unique=True) 
    first_seen = db.Column(db.DateTime(), 
     default = datetime.datetime.utcnow 
    ) 
    last_seen = db.Column(db.DateTime(), 
     default = datetime.datetime.utcnow 
    ) 

    @validates('ip') 
    def validate_ip(self, key, ip): 
     assert is_ip_addr(ip) 
     return ip 

Da db nicht mehr ein Hinweis auf flask.ext.sqlalchemy.SQLAlchemy(app) sein, wie kann ich mein Modell umbauen SQLAlchemy zu verwenden. Gibt es eine Möglichkeit für die beiden Anwendungen (eine mit Flask-SQLAlchemy die andere mit SQLAlchemy), die gleiche Datenbank zu verwenden?

+0

Die * Datenbank * sollte die unabhängig sein * Modelle * oder ORM-Ebene, die Sie verwenden. – Makoto

+0

Ja, das verstehe ich. Ich suche nach einer Möglichkeit, Code sowohl in Kolben als auch in Nicht-Kolben zu verwenden, ohne meine Modelldefinitionen in irgendeiner signifikanten Weise ändern zu müssen. – amccormack

+0

In Ihrem Modell gibt es nichts, was mit Kolben zu tun hat. Alles, was Sie brauchen, ist eine db-Verbindung zu erstellen und Ihr Modell in eine flash- oder non-flask-App zu importieren. Ich würde das Modell einfach in 'models.py' einfügen (verschiebe einfach das obige von der flask-Haupt-.py-Datei und importiere/instanziiere IPentry, wenn nötig). –

Antwort

0

prüfen dieses github.com/mardix/active-alchemy

Active-Alchemy ist ein Framework Agnostic Wrapper für SQLAlchemy, die es wirklich einfach macht, indem Sie einen einfachen aktiven Datensatz wie verwenden api, während es immer noch die db.session darunter verwendet. Inspiriert von Flask-SQLAlchemy

0

Sie diese db.Model ersetzen kann:

from sqlalchemy import orm 
from sqlalchemy.ext.declarative import declarative_base 
import sqlalchemy as sa 

base = declarative_base() 
engine = sa.create_engine(YOUR_DB_URI) 
base.metadata.bind = engine 
session = orm.scoped_session(orm.sessionmaker())(bind=engine) 

# after this: 
# base == db.Model 
# session == db.session 
# other db.* values are in sa.* 
# ie: old: db.Column(db.Integer,db.ForeignKey('s.id')) 
#  new: sa.Column(sa.Integer,sa.ForeignKey('s.id')) 
# except relationship, and backref, those are in orm 
# ie: orm.relationship, orm.backref 
# so to define a simple model 

class UserModel(base): 
    __tablename__ = 'users' #<- must declare name for db table 
    id = sa.Column(sa.Integer,primary_key=True) 
    name = sa.Column(sa.String(255),nullable=False) 

dann die Tabellen zu erstellen:

base.metadata.create_all() 
1

Diese nicht vollständig Ihre Frage beantworten, weil es tut Flask-Abhängigkeit nicht entfernen, aber Sie können SqlAlchemy in Skripten und Tests nur nicht ausgeführt die Flask App verwenden.

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 
from sqlalchemy import MetaData 

test_app = Flask('test_app') 
test_app.config['SQLALCHEMY_DATABASE_URI'] = 'database_uri' 
test_app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 

metadata = MetaData(schema='myschema') 
db = SQLAlchemy(test_app, metadata=metadata) 

class IPEntry(db.Model): 
    pass 

Eine Schwierigkeit auftreten können, ist die Anforderung von db.Model als Basisklasse für Ihre Modelle zu verwenden, wenn Sie die Web-App und unabhängige Skripte mit gleichen Code-Basis ausrichten möchten. Eine mögliche Lösung besteht darin, dynamischen Polymorphismus zu verwenden und die Klassendefinition in eine Funktion umzubrechen.

def get_ipentry(db): 
    class IPEntry(db.Model): 
     pass 
    return IPEntry 

Wie Sie die Klasse zur Laufzeit in der Funktion konstruieren, können Sie in verschiedenen SqlAlchemy Instanzen passieren können. Einziger Nachteil ist, dass Sie die Funktion aufrufen müssen, um die Klasse zu konstruieren, bevor Sie sie verwenden.

db = SqlAlchemy(...) 
IpEntry = get_ipentry(db) 
IpEntry.query.filter_by(id=123).one() 
Verwandte Themen