Al principio debe compartir metadata
y no usar el db.Model de frasco-sqlalchemy como base para su aplicación reutilizable.
En segundo lugar, debe volver a crear todas las clases extendiéndoles nuevas bases de flask-sqlalchemy para soportar señales, atajos y otras cosas.
Integrar bases (puede ser con errores):
def integrate_models(cls, nbase):
new_bases = list(cls.__bases__) + [nbase]
new_dict = dict(cls.__dict__)
new_dict.update(dict(nbase.__dict__))
return type.__new__(cls.__class__, cls.__name__, tuple(new_bases), new_dict)
Ejemplo Flask aplicación con extensión sqlalchemy:
# -*- coding: utf-8 -*-
from flask import Flask
from flaskext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
def __init__(self, username, email):
self.username = username
self.email = email
def __repr__(self):
return '<User %r>' % self.username
if __name__ == '__main__':
from some_model_base import init_metadata
init_metadata(db.Model.metadata)
from some_model import SomeClass
SomeClass = integrate_models(SomeClass, db.Model)
db.create_all()
print SomeClass.query.all()
Dónde some_model_base.py:
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
def init_metadata(metadata):
Base.metadata = metadata
Y some_model.py :
from sqlalchemy import Column, Integer, String
from some_model_base import Base
class SomeClass(Base):
__tablename__ = 'some_table'
id = Column(Integer, primary_key=True)
name = Column(String(50))
En este ejemplo, solo se probaron los accesos directos db.create_all y SomeClass.query.
Lo siento por mi pobre inglés.
Hm, tendré que probar esto. ¿Puedes encontrar una forma de configurar los modelos en el otro módulo para tener una relación con los modelos en el programa principal? –
Creo que la mejor forma de hacerlo es declarar en sus clases base de aplicaciones reutilizables o MixIns y luego crear modelos concretos subclasándolos. – estin