【问题标题】:sqlalchemy multiple databases with same table names not workingsqlalchemy 具有相同表名的多个数据库不起作用
【发布时间】: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


【解决方案1】:

由于实际上这些表具有不同的结构,因此解决方案是简单地创建一个单独的声明性基础。如果这些表确实具有相同的结构,我将只需要一个类用于两个表。

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

【讨论】:

    【解决方案2】:

    您可以使用一个 db 实例和两个 Model 来绕过这个问题。

    这也可以用于在 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'
    

    【讨论】:

    • 在哪些情况下可能想要使用单个数据库实例模式而不是两个不同的实例,如 @dangel 所示?
    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 2016-06-16
    • 2010-12-29
    • 2019-01-09
    • 1970-01-01
    • 2018-05-24
    • 2016-09-10
    • 2018-12-25
    相关资源
    最近更新 更多