sqlalchemy несколько баз данных с одинаковыми именами таблиц не работает - PullRequest
5 голосов
/ 25 ноября 2011

У меня есть две базы данных, с которыми я работаю в 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 становится немного запутанной, когда речь идет о разнице в декларативном и классическом использовании класса.

Ответы [ 2 ]

7 голосов
/ 27 ноября 2011

Поскольку в действительности таблицы имели разные структуры, решение было просто создать отдельную декларативную базу.Если бы таблицы действительно имели одинаковую структуру, мне понадобился бы только один класс для обеих таблиц.

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 голосов
/ 12 мая 2016

Вы можете использовать один экземпляр db с двумя Model , чтобы обойти эту проблему.

И это также может быть использовано для реализации варианта использования master / slave в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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...