2011-11-25 3 views
4

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.

+0

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

+1

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

Répondre

6

Comme en réalité les tables avaient des structures différentes, la solution consistait simplement à créer une base déclarative distincte. Si les tables avaient effectivement la même structure, je n'aurais eu besoin que d'une classe pour les deux tables.

Base = declarative_base() 
Base2 = declarative_base() #this is all I needed 

class MYSQLWo(Base): 
.... 
class MYSQLWocom(Base): 
.... 
class MP2Wo(Base2): 
.... 
class MP2Wocom(Base2) 

http://groups.google.com/group/sqlalchemy/browse_thread/thread/afe09d6387a4dc69?hl=en

0

Vous pouvez utiliser un db exemple avec deux modèle pour contourner ce problème.

Cela peut également être utilisé pour implémenter un cas d'utilisation maître/esclave dans Flask-SQLAlchemy.

comme ceci:

app = Flask(__name__) 
app.config['SQLALCHEMY_BINDS'] = {'rw': 'rw', 'r': 'r'} 
db = SQLAlchemy(app) 
db.Model_RW = db.make_declarative_base() 

class A(db.Model): 
    __tablename__ = 'common' 

class B(db.Model_RW): 
    __tablename__ = 'common' 
Questions connexes