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
mashpolo
V2EX  ›  Python

关于 flask-sqlalchemy 的跨 db 查询

  •  
  •   mashpolo ·
    mashpolo · 2020-01-16 21:28:32 +08:00 · 3231 次点击
    这是一个创建于 1771 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天碰到一个棘手的问题,一个接口需要同时查询两个 db 的两个表,但其中一个表,sqlalchemy 查找的 db 是另外一个,导致查询找不到该表

    model 代码如下

    class BusinessGroup(db.Model):
        __bind_key__ = 'amp'
        __tablename__ = 'business_group'
    
        business_group_id = Column(db.BigInteger, primary_key=True)
        
    class DeployJob(Base):
        __tablename__ = 'deploy_job'
    
        id = Column(BIGINT(20), primary_key=True)
    

    数据库连接:

    
    SQLALCHEMY_BINDS = {'amp': 'mysql+pymysql://{user}:{passwd}@{host}:{port}/{db}'.format(**AMP_MYSQL_CFG)}
    

    查询的接口代码

    def getDpJobList():
        try:
            deploy_jobs_basic = db.session.query(DeployJob.id,
                                                 BusinessGroup.dept_id)
    
    

    得到的错误:

    (pymysql.err.ProgrammingError) (1146, "Table 'monitor.deploy_job' doesn't exist")
    

    不知道有知道该问题所在的小伙伴没?求指导。 多谢

    9 条回复    2021-07-19 15:51:27 +08:00
    yzongyue
        1
    yzongyue  
       2020-01-16 21:57:33 +08:00
    两个 db (schema) 不在一个 db 上?那没办法了,分别查出来 python 处理下吧
    mashpolo
        2
    mashpolo  
    OP
       2020-01-16 22:29:08 +08:00
    @yzongyue #1 看文档应该是可以的,使用`__bind_key__`可以定义另外的 model,但我这个,不知道是哪出问题了。查询非 bind 的 table 的时候,结果找到 bind 的 db 中去了
    outoftimeerror
        3
    outoftimeerror  
       2020-01-16 23:17:08 +08:00
    直接 presto 吧
    yzongyue
        4
    yzongyue  
       2020-01-16 23:39:11 +08:00 via Android
    @mashpolo bind key 可以绑定不同的 db,但 python 代码最终还是要转换成 sql,不在一个 db 当然不能一个 sql 查出来
    tairan2006
        5
    tairan2006  
       2020-01-17 08:45:19 +08:00 via Android
    直接裸用 sqlalchemy,新建一个 engine…
    whoosy
        6
    whoosy  
       2020-01-17 09:13:12 +08:00
    两个 db 不能用同一个 session,也就是不能用一个 db.session, 但是可以再开一个 db.session 去查
    mashpolo
        7
    mashpolo  
    OP
       2020-01-17 11:20:41 +08:00
    @yzongyue #4
    @tairan2006 #5
    @whoosy #6 了解了,看来确实不行,我修改下设计的思路
    houzhiqiang
        8
    houzhiqiang  
       2021-07-19 15:49:38 +08:00
    可以看看官方文档
    http://www.pythondoc.com/flask-sqlalchemy/config.html
    有这样一个配置项
    SQLALCHEMY_BINDS
    houzhiqiang
        9
    houzhiqiang  
       2021-07-19 15:51:27 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   986 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:18 · PVG 05:18 · LAX 13:18 · JFK 16:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.