首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sqlalchemy具有相同表名的多个数据库不起作用

问sqlalchemy具有相同表名的多个数据库不起作用
EN

Stack Overflow用户
提问于 2011-11-25 11:54:30
回答 2查看 7.3K关注 0票数 8

我使用SQLAlchemy在Python中使用了两个数据库,这两个数据库共享表名,因此在运行代码时会收到错误消息。

错误消息为:

代码语言:javascript
复制
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.

简化后的代码如下:

代码语言:javascript
复制
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文档会让人感到有点困惑。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-27 12:06:23

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

代码语言:javascript
复制
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

票数 9
EN

Stack Overflow用户

发布于 2016-05-12 15:36:31

您可以将一个db实例与两个模型一起使用,以绕过此问题。

这也可用于在Flask-SQLAlchemy中实现主/从用例。

就像这样:

代码语言:javascript
复制
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'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8264686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档