代码之家  ›  专栏  ›  技术社区  ›  Wes Winham

Django:如何获取项目中的每个表和所有表的列?

  •  3
  • Wes Winham  · 技术社区  · 14 年前

    我正在使用mysql创建一组SQL完整数据库复制脚本,将其放入outfile并加载本地infile中的数据。

    明确地:

    SELECT {columns} FROM {table} INTO OUTFILE '{table}.csv'
    
    LOAD DATA LOCAL INFILE '{table}.csv' REPLACE INTO {table} {columns}
    

    因此,我不需要仅仅是表,我还需要表的列。

    我可以得到所有的表和列,但这不包括M2M表:

    from django.db.models import get_models()
    for model in get_models():
        table = model._meta.db_table
        columns = [field.column for field in model._meta.fields]
    

    我还可以获取所有表,但这不允许我访问列:

    from django.db import connection
    tables = connection.introspection.table_names()
    

    对于django项目,如何获取该表上的每个表和每个对应列?

    更多细节:

    我在一个相当大的数据集(>1GB)上执行此操作,因此使用 flat file 方法似乎是在MySQL中制作如此大的副本的唯一合理方法。我已经复制了架构(使用./manage.py syncdb--migrate),我面临的问题是复制数据,这要求我拥有表和列来创建正确的SQL语句。另外,我不能使用默认列排序的原因是,我从中复制的生产数据库的列排序与使用新的syncdb创建的数据库的列排序不同(由于需要数月的迁移和架构更改)。

    3 回复  |  直到 8 年前
        1
  •  6
  •   Bartek    14 年前

    你看了吗 manage.py ?

    您可以获取大量的SQL信息,例如,要获取项目中应用程序的所有创建表语法,可以执行以下操作:

    python manage.py sqlall <appname>
    

    如果键入:

    python manage.py help
    

    您可以看到许多其他功能。

        2
  •  3
  •   r3m0t    8 年前

    我找到了这个答案的来源。我觉得可能有更好的方法,但这确实有好处。

    第一个块获取所有普通(非M2M)表及其列

    from django.db import connection
    from django.apps import apps
    
    table_info = []
    tables = connection.introspection.table_names()
    seen_models = connection.introspection.installed_models(tables)
    for model in apps.get_models():
        if model._meta.proxy:
            continue
    
        table = model._meta.db_table
        if table not in tables:
            continue
    
        columns = [field.column for field in model._meta.fields]
        table_info.append((table, columns))
    

    下一个街区是个棘手的地方。它获取所有M2M字段表及其列。

    for model in apps.get_models():
        for field in model._meta.local_many_to_many:
            if not field.creates_table:
                continue
    
            table = field.m2m_db_table()
            if table not in tables:
                continue
            columns = ['id'] # They always have an id column
            columns.append(field.m2m_column_name())
            columns.append(field.m2m_reverse_name())
            table_info.append((table, columns))
    
        3
  •  0
  •   eruciform    14 年前

    你看过“manage.py dumpdata”和“manage.py loaddata”吗?它们以JSON格式转储和加载。我用它从一个站点转储东西,覆盖另一个站点的数据库。它在dumpdata上没有“每个数据库”选项,但是您可以在“manage.py dbshell”命令的结果中循环调用它。