Django: Как мне получить каждую таблицу и все столбцы этой таблицы в проекте? - PullRequest
3 голосов
/ 09 июля 2010

Я создаю набор сценариев полного копирования базы данных SQL, используя MySQL INTO OUTFILE и LOAD DATA LOCAL 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?

Подробнее:

Я делаю это на достаточно большом наборе данных (> 1 ГБ), поэтому использование плоского файла *1019* метод представляется единственным разумным способом сделать такой большой размер копии в MySQL. У меня уже есть скопированная схема (с использованием ./manage.py syncdb --migrate), и проблема, с которой я столкнулся, связана именно с копированием данных, которое требует от меня наличия таблиц и столбцов для создания правильных операторов SQL. Кроме того, причина, по которой я не могу использовать порядок столбцов по умолчанию, состоит в том, что производственная база данных, из которой я копирую, имеет порядок столбцов, отличный от того, который создается с помощью новой syncdb (из-за миграций и изменений схемы за многие месяцы).

Ответы [ 3 ]

6 голосов
/ 09 июля 2010

Вы смотрели на manage.py ?

Вы можете получить множество данных SQL, например, чтобы получить весь синтаксис создания таблицы для приложения в вашем проекте, который вы можете сделать:

python manage.py sqlall <appname>

Если вы введете:

python manage.py help

Вы можете увидеть множество других функций.

3 голосов
/ 10 июля 2010

Я покопался в источнике, чтобы найти это решение.Я чувствую, что, возможно, есть лучший способ, но это помогает.

Этот первый блок получает все обычные (не 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))
0 голосов
/ 09 июля 2010

Вы смотрели в "manage.py dumpdata" и "manage.py loaddata"?Они сбрасывают и загружают в формате JSON.Я использую его для выгрузки содержимого с одного сайта и перезаписи базы данных другого сайта.У него нет опции «каждая база данных» в dumpdata, но вы можете вызвать ее в цикле по результатам команды manage.py dbshell.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...