【问题标题】:Django - There is a way to get the current database alias?Django - 有办法获取当前数据库别名吗?
【发布时间】:2015-05-25 17:46:07
【问题描述】:

我正在一个包含多个数据库的 django 项目中工作,我正在寻找一种使用导入或方法获取当前数据库别名的方法。

我一直在搜索文档,但没有找到任何有用的信息。

【问题讨论】:

    标签: python django django-models django-orm


    【解决方案1】:

    在 Django 中并不完全有“当前”数据库别名。

    查看 db 路由器的文档以了解原因:
    https://docs.djangoproject.com/en/1.8/topics/db/multi-db/#database-routers

    (尽管@fasouto 确实正确显示了“当前”别名,但在特定模型的读取操作上下文中,通过使用 QuerySet 的私有 API)

    试试这个:

    from django.db import router
    
    alias_for_read = router.db_for_read(MyModelClass)
    # optionally:
    alias_for_read = router.db_for_read(MyModelClass, instance=my_model_instance)
    
    # similarly:
    alias_for_write = router.db_for_write(MyModelClass)
    alias_for_write = router.db_for_write(MyModelClass, instance=my_model_instance)
    

    关于instance 参数... db 路由器类的规范说它们应该接受**hints kwargs。他们还声明目前唯一支持的提示是instance。但除非您有一个使用此提示的自定义路由器类,否则您不需要提供当前实例。

    【讨论】:

      【解决方案2】:

      如果您有 QuerySet,您可以使用 db property 检索数据库名称:

      >>> f = Item.objects.all()
      >>> f.db
      'default'
      

      如果您有模型实例(您评估了 QuerySet),您可以查询 ModelState(请注意,这没有记录,因此将来可能会更改,并且不建议在应用程序中使用 @Weier 说的) :

      >>> f = Item.objects.all()[4]
      >>> f._state.db
      'default'
      

      【讨论】:

      • 最好不要提供代码实现的链接作为参考。任何在 Django 文档中没有提到的东西都应该被认为是私有 API,并且不能在 Django 应用程序中使用。
      • 你是对的,QuerySet.db 记录在案,而 ModelState 没有。编辑
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      • 2019-09-10
      • 1970-01-01
      相关资源
      最近更新 更多