Flask heredó clases de tablas en múltiples bases de datos idénticas usando __bind_key__

Estoy tratando de construir un panel de control de administración que reúna a 4 sitios de comercio electrónico diferentes. Todos los sitios tienen estructuras de base de datos idénticas (todos MySQL).

¿Qué va mal?

Obtengo 404 No encontrado en cualquier ID de pedido y sitio que coloqué. No importa cómo lo mezcle, no puedo obtener ningún registro. Siempre un 404 y no tengo ni idea de por qué. Así que aquí estoy.

Código

Intenté hacer esto creando clases de modelos base de cada tabla. Luego, crear clases heredadas de esas clases base con una clave de enlace diferente que depende de la base de datos para la que está destinado. Esta es una vista resumida del código; si necesita más que esto, hágamelo saber:

basemodels.py

MyOrderClass(db.Model): __tablename__ = 'messytablename' id = db.Column('order_id', db.Integer, primary_key=True) order_total = db.Column(db.Float) order_status = db.Column(db.String(1)) 

site2models.py

 class Site2Order(MyOrderClass): __bind_key__ = 'site2' 

__init__.py

 app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:pass@localhost/site' app.config['SQLALCHEMY_BINDS'] = { 'site1':'mysql://user:pass@localhost/site1', 'site2':'mysql://user:pass@localhost/site2', 'site3':'mysql://user:pass@localhost/site3', 'site4':'mysql://user:pass@localhost/site4' } 

vistas.py

 @app.route('/order//') def show_order(site, orderid): if site == 'site1': orderObject = Site1Order if site == 'site2': orderObject = Site2Order if site == 'site3': orderObject = Site3Order if site == 'site4': orderObject = Site4Order order = orderObject.query.get(orderid) return render_template('order.html', order=order) 

Los sitios originales están construidos en PHP y tienen menos de estructuras ordenadas y convenciones de nomenclatura.

Gracias por tu tiempo.

El problema actualmente con SQLALCHEMY_BINDS es que solo se usa para operaciones como create_all () o drop_all (); debe cambiar el enlace de sesión para eso:

 db.session.bind = db.get_engine(app, 'site2') 

Hay trabajo en curso para cambiar eso, pero todavía no está en el maletero.

Su código podría ser como:

 db.session.bind = db.get_engine(app, orderObject.__bind_key__) order = orderObject.query.get(orderid) 

Pero recuerde que esto cambia la sesión global y no la restablece, tendría que hacerlo usted mismo o escribir un administrador de contexto para que pueda usar la statement with para eso.

Si sus modelos son idénticos en todas las bases de datos, esta también podría ser la manera de tener solo una clase para todas las bases de datos, deje la bind_key y consúltelos con un objeto de sesión de enlace especial.

Edición : con el Flask-SQLAlchemy 0.15 Suelte un MyModel.query.filter simple (…) es posible para diferentes bases de datos si definió __bind_key__ correctamente.

db.Model.metadata.tables [‘nombre de tu modelo’]. info [‘bind_key’] = ‘your bind_name’

Encontré una manera de hacer las cosas fáciles