V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
lolizeppelin
V2EX  ›  Python

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

  •  
  •   lolizeppelin · 2019-10-30 11:21:50 +08:00 · 3036 次点击
    这是一个创建于 1612 天前的主题,其中的信息可能已经有所发展或是发生改变。

    伪代码如下

    
    
    
    class ModelBase(models.ModelBase):
    	...
        
    
    DBBASE = declarative.declarative_base(cls=ModelBase)
    
    
    class Project(DBBASE):
    	...
            
    
    

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

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

    6 条回复    2019-10-31 01:06:28 +08:00
    wangyzj
        1
    wangyzj  
       2019-10-30 13:15:40 +08:00
    慢慢看吧
    那文档我也觉得贼他妈乱
    lolizeppelin
        2
    lolizeppelin  
    OP
       2019-10-30 15:20:14 +08:00
    搞不定 最后只能用 metadata 来判断

    if obj.__class__.metadata is not DBBASE.metadata:
    return
    cz5424
        3
    cz5424  
       2019-10-30 18:58:56 +08:00 via iPhone
    没看明白问题
    lolizeppelin
        4
    lolizeppelin  
    OP
       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
        5
    neoblackcap  
       2019-10-30 21:14:11 +08:00 via iPhone
    什么跟什么啊? session 跟 mapper 不是分离的吗?
    你要查是哪个数据库,应该查这个对象是不是在对应的 session 实例里面就可以了。
    你提到 db object,你是在用 Flask-SQLAlchemy 吧?
    lolizeppelin
        6
    lolizeppelin  
    OP
       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: 这种方式也行
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2876 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:04 · PVG 21:04 · LAX 06:04 · JFK 09:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.