【问题标题】:SQLAlchemy: Same table but different database engineSQLAlchemy:相同的表但不同的数据库引擎
【发布时间】:2018-12-25 18:27:20
【问题描述】:

我有一个使用 SQLAlchemy 的项目,它连接到两个不同的数据库,并且都有相同的表名 sample_table。这是当前的设置:

# In config/base.py
from sqlalchemy import create_engine
from sqlalchemy_utils import database_exists, create_database

...
...
...

db1_engine = create_engine(app.config['DB1_URI'], echo = False, pool_recycle = 1800)

if not database_exists(db1_engine.url):
    create_database(db1_engine.url)

print(database_exists(db1_engine.url))

db2_engine = create_engine(app.config['DB2_URI'], echo = False, pool_recycle = 1800)

if not database_exists(db2_engine.url):
    create_database(db2_engine.url)

print(database_exists(db2_engine.url)
...
...
...

-

# In database1/sample_table.py
from sqlalchemy import Column, String, Integer
from config.base import Base

class SampleTable(Base):
   __tablename__ = 'sample_table'
   id = Column(Integer(), primary_key=True)
   ...
   ...

-

# In database2/sample_table.py
from sqlalchemy import Column, String, Integer
from config.base import Base

class SampleTable(Base):
   __tablename__ = 'sample_table'
   id = Column(Integer(), primary_key=True)
   ...
   ...

-

# In controllers/db1.py
from config.base import db1_engine
from database1.sample_table import SampleTable

generate_db1_tables():
   if not db1_engine.dialect.has_table(db1_engine.connect(), "sample_table"):
    SampleTable.__table__.create(db1_engine)

-

# In controllers/db2.py
from config.base import db2_engine
from database2.sample_table import SampleTable

generate_db2_tables():
   if not db2_engine.dialect.has_table(db2_engine.connect(), "sample_table"):
    SampleTable.__table__.create(db2_engine)

-

# In app/app.py
from controllers.db1 import generate_db1_tables
from controllers.db2 import generate_db2_tables
...
...
generate_db1_tables()
generate_db2_tables()
...
...

当我运行上面的代码时,我得到了:

sqlalchemy.exc.InvalidRequestError: Table 'sample_table' is already defined for this MetaData instance.  Specify 'extend_existing=True' to redefine options and columns on an existing Table object.

但是当我在每个模型中添加__table_args__ = {'extend_existing': True} 时,database2 中的sample_tabledatabase1 中的sample_table 中具有相同的字段。它们有不同的结构。

从事此类项目的最佳做法是什么?

请注意,创建数据库和表的目的是模拟本地主机中的工作。数据库和表已经存在于生产环境中。

谢谢!

【问题讨论】:

    标签: python mysql sql sqlalchemy flask-sqlalchemy


    【解决方案1】:

    如果有人遇到相同的情况,我通过更新以下内容来修复错误:

    # In config/base.py
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy_utils import database_exists, create_database
    
    ...
    ...
    ...
    
    db1_engine = create_engine(app.config['DB1_URI'], echo = False, pool_recycle = 1800)
    if not database_exists(db1_engine.url):
        create_database(db1_engine.url)
    
    print(database_exists(db1_engine.url))
    ...
    ...
    ...
    Db1Base = declarative_base()
    Db2Base = declarative_base()
    

    -

    # In database1/sample_table.py
    from sqlalchemy import Column, String, Integer
    from config.base import Db1Base
    
    class SampleTable(Db1Base):
    ...
    ...
    ...
    

    -

    # In database2/sample_table.py
    from sqlalchemy import Column, String, Integer
    from config.base import Db2Base
    
    class SampleTable(Db2Base):
    ...
    ...
    ...
    

    【讨论】:

      猜你喜欢
      • 2016-02-12
      • 1970-01-01
      • 2020-08-07
      • 2021-07-21
      • 2017-04-20
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多