【发布时间】:2012-01-06 01:45:06
【问题描述】:
我正在使用 SQLAlchemy 在 Python 中使用两个数据库,这些数据库共享表名,因此在运行代码时我收到一条错误消息。
错误信息是:
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 文档在谈论类声明性和经典用法的区别时有点混乱。..
【问题讨论】:
-
我在你的源代码中删除了一个随机的
)我认为这是一个错字,如果不是,它可以恢复。 -
我有答案:由于实际上这些表的结构略有不同,因此解决方案是简单地创建一个单独的声明性基础。如果这些表确实具有相同的结构,我就不需要创建一个单独的类。
Base = declarative_base()Base2 = declarative_base()
标签: sqlalchemy python-2.7