
伪代码如下
class ModelBase(models.ModelBase): ... DBBASE = declarative.declarative_base(cls=ModelBase) class Project(DBBASE): ... 我想从 db object 中获取到 DBBASE 对象用什么属性或者方法?
文档真看晕了,一下子也没从属性中找到
1 wangyzj 2019 年 10 月 30 日 慢慢看吧 那文档我也觉得贼他妈乱 |
2 lolizeppelin OP 搞不定 最后只能用 metadata 来判断 if obj.__class__.metadata is not DBBASE.metadata: return |
3 cz5424 2019 年 10 月 30 日 via iPhone 没看明白问题 |
4 lolizeppelin OP 我想从一个 db object 的属性里找到他的 declarative base 对象 从而分辨这个 db object 是哪个数据库连接的 应该可用 obj.__class__.__mro__[1] is DBBASE 来确定这个 db object 的 declarative base 但是我不太想用 mro.....因为不是那么熟 |
5 neoblackcap 2019 年 10 月 30 日 via iPhone 什么跟什么啊? session 跟 mapper 不是分离的吗? 你要查是哪个数据库,应该查这个对象是不是在对应的 session 实例里面就可以了。 你提到 db object,你是在用 Flask-SQLAlchemy 吧? |
6 lolizeppelin OP 我用到 openstack 的 oovo 我想支持多个数据库(拆分日志库,业务数据库) 具体就不细说了 现在的是改造 https://github.com/openstack/neutron-lib/blob/master/neutron_lib/db/api.py 的 event.listens_for 部分 因为他的代码里不需要支持多个数据库,所以_emit_on_pending 是个单独的 因为我有多个库, 所以需要通过不同的 declarative base (不同数据库的表继承不同的 declarative base )反馈返回不同的_emit_on_pending 如果用 session 来区分,下面这种没 session 的监听就不好处理 @event.listens_for(model_base.BASEV2, "attribute_instrument", propagate=True) 所以我需要 db object 里获取到对应的 declarative base,但是不是很想通过 mro 好像用 obj.__class__.metadata is not BASEV2.metadata: 这种方式也行 |