2011-11-25 104 views
4

我有兩個數據庫,我正在使用SQLAlchemy與Python一起使用,數據庫共享表名,因此運行代碼時收到錯誤消息。sqlalchemy具有相同表名稱的多個數據庫不起作用

的錯誤信息是:

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. 

簡化代碼如下:

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) 

我該如何處理與具有相同的表結構的數據庫?我猜它與MetaData實例有關,但是當談論類聲明和古典用法的差異時,SQLAlchemy文檔變得有點混亂..

+0

我刪除隨機')'在源代碼中我認爲是一個錯字,如果它不是可以恢復。 – GWW

+1

我有答案: 由於實際上表格有稍微不同的結構,解決方案是簡單地創建一個單獨的聲明基礎。如果表格確實具有相同的結構,我不需要創建一個單獨的類。 'Base = declarative_base()' 'Base2 = declarative_base()' – dangel

回答

6

由於實際上表具有不同的結構,解決方案是簡單地創建一個單獨的聲明基礎。如果表格確實具有相同的結構,那麼我只需要兩個表格都需要一個類別。

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

您可以使用一個分貝例如有兩個模式繞過這個問題。

這也可以用來實現Flask-SQLAlchemy中的主/從用例。

就像這樣:

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' 
相關問題