Ho già fatto una domanda simile, ma ho pensato che potrei riformularlo, o mostrare quello che ho fatto per far luce su quello che sta succedendo qui.Database identici in Flask-SQLAlchemy
Attualmente ho 2 basi di dati identici, e ho tentato di risolvere il problema (come da un'altra domanda che ho visto) come questo:
class BaseTable(db.Model):
__tablename__ = 'TableName'
col = db.Column(db.Integer)
class SubTable1(BaseTable):
__bind_key__ = 'bind1'
class SubTable2(BaseTable):
__bind_key__ = 'bind2'
Il problema di questo è che ora il più recente BIND è usato ovunque, quindi se lo faccio da qualche altra parte:
SubTable1.query.filter_by(col=12).all()
Quindi ottiene i risultati dal secondo database. Se dovessi cambiare la posizione delle classi SubTable, i risultati sono gli stessi (Modifica per chiarezza: con questo intendo che i risultati provengono da qualunque vincolo è definito per ultimo, se dovessero essere commutati, richiederebbe invece la query da 'bind2' invece di 'bind1' come fa attualmente). Non so davvero cosa fare, quindi se puoi aiutare in qualsiasi modo sarebbe fantastico.
Grazie.
MODIFICA: Se è impossibile (o semplicemente conosci un modo migliore o addirittura diverso) per farlo, faccelo sapere. Se potessi fare qualcosa come avere due oggetti db diversi, sarebbe anche meglio, semplicemente non so come farlo o quale tipo di implicazioni avrebbe.
EDIT 2: Dopo aver lavorato con questo per ore e ore, sono finalmente giunto a una conclusione su come farlo.
In __init__.py:
db1 = SQLAlchemy(app)
db2 = SQLAlchemy(app)
In models.py:
class Table1(db1.Model):
__tablename__ = 'TableName'
__bind_key__ = 'bind1'
col = db1.Column(db1.Integer)
class Table2(db2.Model):
__tablename__ = 'TableName'
__bind_key__ = 'bind2'
col = db2.Column(db2.Integer)
La ragione di questa assurdità è che si lega possono essere definiti solo una volta e non è cambiato, e non ci sono due nomi di tabella può essere lo stesso, anche se i bind sono diversi. Quindi devi creare 2 istanze di MetaData altrimenti SQLAlchemy si arrabbia. Quindi si scopre che il problema è una limitazione in SQLAlchemy.