有比较熟 sqlalchemy 的坛友不,问个属性问题,文档太多都不知道哪翻了

2019-10-30 11:21:50 +08:00
 lolizeppelin

伪代码如下




class ModelBase(models.ModelBase):
	...
    

DBBASE = declarative.declarative_base(cls=ModelBase)


class Project(DBBASE):
	...
        

我想从 db object 中获取到 DBBASE 对象用什么属性或者方法?

文档真看晕了,一下子也没从属性中找到

3074 次点击
所在节点    Python
6 条回复
wangyzj
2019-10-30 13:15:40 +08:00
慢慢看吧
那文档我也觉得贼他妈乱
lolizeppelin
2019-10-30 15:20:14 +08:00
搞不定 最后只能用 metadata 来判断

if obj.__class__.metadata is not DBBASE.metadata:
return
cz5424
2019-10-30 18:58:56 +08:00
没看明白问题
lolizeppelin
2019-10-30 20:00:56 +08:00
我想从一个 db object 的属性里找到他的 declarative base 对象
从而分辨这个 db object 是哪个数据库连接的

应该可用 obj.__class__.__mro__[1] is DBBASE 来确定这个 db object 的 declarative base
但是我不太想用 mro.....因为不是那么熟
neoblackcap
2019-10-30 21:14:11 +08:00
什么跟什么啊? session 跟 mapper 不是分离的吗?
你要查是哪个数据库,应该查这个对象是不是在对应的 session 实例里面就可以了。
你提到 db object,你是在用 Flask-SQLAlchemy 吧?
lolizeppelin
2019-10-31 01:06:28 +08:00
我用到 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: 这种方式也行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/614374

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX