我正在尝试使用schema_translate_map
更改架构:
Base = declarative_base()
class DataAccessLayer():
def __init__(self):
conn_string = "mysql+mysqlconnector://root:root@localhost/"
self.engine = create_engine(conn_string)
Session = sessionmaker()
Session.configure(bind=self.engine)
self.session = Session()
def change_schema(self):
self.session.connection(execution_options={"schema_translate_map": {"belgarath": "belgarath_test"}})
class Player(Base):
__tablename__ = "player"
__table_args__ = {'schema': "belgarath"}
id_ = Column(Integer, primary_key=True)
dal = DataAccessLayer()
dal.change_schema()
qry = dal.session.query(Player.id_)
print(qry)
然而,SQL 的结果是:
SELECT belgarath.player.id_ AS belgarath_player_id_
FROM belgarath.player
代替:
SELECT belgarath_test.player.id_ AS belgarath_test_player_id_
FROM belgarath_test.player
我哪里错了?
尝试一下如果你简单地附加会发生什么.all()
给你的qry
:
from sqlalchemy import Integer
from sqlalchemy import Column
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class DataAccessLayer():
def __init__(self):
conn_string = "sqlite:///:memory:"
#conn_string = "mysql+mysqlconnector://root:root@localhost/"
self.engine = create_engine(conn_string)
Session = sessionmaker()
Session.configure(bind=self.engine)
self.session = Session()
def change_schema(self):
self.session.connection(execution_options={"schema_translate_map": {"belgarath": "belgarath_test"}})
class Player(Base):
__tablename__ = "player"
__table_args__ = {'schema': "belgarath"}
id_ = Column(Integer, primary_key=True)
dal = DataAccessLayer()
dal.change_schema()
qry = dal.session.query(Player.id_)
print(qry.all())
输出(无痕迹):
OperationalError: (sqlite3.OperationalError) no such table: belgarath_test.player
[SQL: SELECT belgarath_test.player.id_ AS belgarath_player_id_
FROM belgarath_test.player]
(Background on this error at: http://sqlalche.me/e/13/e3q8)
我不是专家,但我想这可能与以下内容有关issue https://github.com/sqlalchemy/sqlalchemy/issues/5004:
模式转换功能发生在编译器内,这显然是错误的。模式分配应该在 SQL 生成之后进行,这样我们只需要一个缓存键。这与 #5002 的思路一致,但我认为即使是与烘焙等一起使用的现有缓存密钥机制也需要将架构翻译完全从编译器中提取出来以用于 1.4,并将其添加到从 ExecutionContext 发生的翻译中,以及扩展逻辑参数集。模式转换旨在为数百/数千个模式提供服务,因此必须更改预缓存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)