【问题标题】:Django: How do I perform database introspection with multiple databases?Django:如何对多个数据库执行数据库自省?
【发布时间】:2016-02-09 18:36:10
【问题描述】:

我的代码可用于从 Django 数据库中获取模型和字段。但是,它只适用于默认数据库。

此函数需要一个数据库名称,我想获取该数据库的表和字段。

def browse_datasource(request, dbname):
    table_info = []
    # This is what I'd /like/ to be able to do, but it doesn't work:
    # tables = connections[dbname].introspection.table_names()
    tables = connection.introspection.table_names()
    found_models = connection.introspection.installed_models(tables)
    for model in found_models:
        tablemeta = model._meta
        columns = [field.column for field in model._meta.fields]
        table_info.append([model.__name__, columns])

如何对非默认数据库执行自省?例如,是否有正确的方法来获取名为“example”的数据库的 connection.introspection?

【问题讨论】:

  • 关系不大,但你考虑过python manage.py inspectdb > models.py吗?
  • 是的,这就是我最初创建一些模型的方式。这是为了允许用户浏览不同的数据库定义(可能带有不同的权限等)。
  • 我也应该澄清一下,因为这可能很重要:我正在使用 1.8.x。
  • 请问这样内省的目的是什么?如果您将所有内容都作为模型代码,那么您处理字段和表格不是更容易吗?
  • 作为此应用程序的一部分,正在动态添加和删除数据库。

标签: python django django-models introspection django-database


【解决方案1】:

我找到了解决方案。诀窍是从连接列表中获取数据库连接,然后获取一个游标并将其传递给 introspection.table_names,如下所示:

table_info = []
conn = connections[dbname]
cursor = conn.cursor()
tables = conn.introspection.table_names(cursor)
found_models = conn.introspection.installed_models(tables)
for model in found_models:
    tablemeta = model._meta

【讨论】:

    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2017-10-04
    • 1970-01-01
    • 2020-05-08
    • 2010-12-24
    • 1970-01-01
    相关资源
    最近更新 更多