J'ai deux bases de données avec lesquelles je travaille avec Python en utilisant SQLAlchemy, les bases de données partagent des noms de tables et donc je reçois un message d'erreur lors de l'exécution du code.sqlalchemy plusieurs bases de données avec les mêmes noms de tables ne fonctionnent pas
Le message d'erreur est:
sqlalchemy.exc.InvalidRequestError: Table 'wo' is already defined for this MetaData instance. Specify 'extend_existing=True' to redefine options and columns on an existing Table object.
Le code simplifié est ci-dessous:
from sqlalchemy import create_engine, Column, Integer, String, DateTime, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship, backref
from mysql.connector.connection import MySQLConnection
Base = declarative_base()
def get_characterset_info(self):
return self.get_charset()
MySQLConnection.get_characterset_info = MySQLConnection.get_charset
mysqlengine = create_engine('mysql+mysqlconnector://......../mp2', echo=True)
MYSQLSession = sessionmaker(bind=mysqlengine)
mysqlsession= MYSQLSession()
MP2engine = create_engine('mssql+pyodbc://......../mp2', echo=True)
MP2Session = sessionmaker(bind=MP2engine)
mp2session= MP2Session()
class MYSQLWo(Base):
__tablename__= 'wo'
wonum = Column(String, primary_key=True)
taskdesc = Column(String)
comments = relationship("MYSQLWocom", order_by="MYSQLWocom.wonum", backref='wo')
class MYSQLWocom (Base):
__tablename__='wocom'
wonum = Column(String, ForeignKey('wo.wonum'), primary_key=True)
comments = Column(String, primary_key=True)
class MP2Wo(Base):
__tablename__= 'wo'
wonum = Column(String, primary_key=True)
taskdesc = Column(String)
comments = relationship("MP2Wocom", order_by="MP2Wocom.wonum", backref='wo')
class MP2Wocom (Base):
__tablename__='woc'
wonum = Column(String, ForeignKey('wo.wonum'), primary_key=True)
location = Column(String)
sublocation1 = Column(String)
texts = Column(String, primary_key=True)
Comment puis-je faire face à des bases de données ayant la même structure de table? Je suppose que cela a quelque chose à voir avec l'instance de MetaData, mais la documentation de SQLAlchemy devient un peu confuse quand on parle de la différence dans l'usage déclaratif et classique de classe.
j'ai enlevé un hasard ')' dans votre code source, je suppose que c'était une faute de frappe si elle ne peut être inversée. – GWW
J'ai la réponse: Puisqu'en réalité les tables avaient des structures légèrement différentes, la solution était simplement de créer une base déclarative séparée. Si les tables avaient effectivement la même structure, je n'aurais pas eu besoin de créer une classe séparée. 'Base = déclarative_base()' 'Base2 = déclarative_base()' – dangel