Django создавать / изменять таблицы по требованию - PullRequest
3 голосов
/ 12 октября 2010

Я искал способ определить таблицы базы данных и изменить их с помощью API Django.

Например, я хотел бы написать некоторый код, который напрямую манипулирует таблицей DDL и позволяет мне определять таблицы или добавлять столбцы в таблицу по требованию программно (без запуска syncdb).Я понимаю, что на ум могут прийти django-south и django-evolution, но я на самом деле не считаю эти инструменты инструментами, предназначенными для интеграции в приложение и используемыми конечным пользователем ... скорее эти инструменты - утилиты, используемые дляОбновление таблиц вашей базы данных.Я ищу что-то, где я могу сделать что-то вроде:

class MyModel(models.Model):  # wouldn't run syncdb.. instead do something like below
    a = models.CharField()
    b = models.CharField()

model = MyModel()
model.create()  # this runs the create table (instead of a syncdb)

model.add_column(c = models.CharField())  # this would set a column to be added
model.alter()   # and this would apply the alter statement 

model.del_column('a')   # this would set column 'a' for removal 
model.alter()   # and this would apply the removal 

Это просто игрушечный пример того, как такой API будет работать, но суть в том, что мне было бы очень интересно узнатьесли есть способ программно создавать и изменять таблицы, как это.Это может быть полезно для таких вещей, как системы управления контентом, где можно динамически создавать новую таблицу.Другим примером может быть сайт, на котором хранятся наборы данных произвольной ширины, для которых таблицы должны генерироваться динамически с помощью интерфейса или импорта данных.Кто-нибудь знает какие-нибудь хорошие способы динамически создавать и изменять таблицы, как это?

(Конечно, я знаю, что можно делать прямые операторы SQL для базы данных, но этому решению не хватает возможности рассматривать базы данных как объекты)

Просто интересно, есть ли у людей какие-либо предложения илиподходы к этому ...

Ответы [ 2 ]

2 голосов
/ 12 октября 2010

Быстро с моей головы ..

Создание собственного менеджера с помощью методов Create / Alter.

1 голос
/ 12 октября 2010

Вы можете попробовать и взаимодействовать с кодом django, который управляет изменениями в базе данных. Это немного ограничено (например, нет ALTER, насколько я вижу), но вы можете расширить его. Вот фрагмент из django.core.management.commands.syncdb.

for app in models.get_apps():
        app_name = app.__name__.split('.')[-2]
        model_list = models.get_models(app)
        for model in model_list:
            # Create the model's database table, if it doesn't already exist.
            if verbosity >= 2:
                print "Processing %s.%s model" % (app_name, model._meta.object_name)
            if connection.introspection.table_name_converter(model._meta.db_table) in tables:
                continue
            sql, references = connection.creation.sql_create_model(model, self.style, seen_models)
            seen_models.add(model)
            created_models.add(model)
            for refto, refs in references.items():
                pending_references.setdefault(refto, []).extend(refs)
                if refto in seen_models:
                    sql.extend(connection.creation.sql_for_pending_references(refto, self.style, pending_references))
            sql.extend(connection.creation.sql_for_pending_references(model, self.style, pending_references))
            if verbosity >= 1 and sql:
                print "Creating table %s" % model._meta.db_table
            for statement in sql:
                cursor.execute(statement)
            tables.append(connection.introspection.table_name_converter(model._meta.db_table))

Взгляните на connection.creation.sql_create_model. Объект creation создается в базе данных базы данных, соответствующей базе данных, которую вы используете в файле settings.py. Все они под django.db.backends.

Если у вас должна быть таблица ALTER, я думаю, вы можете создать свой собственный пользовательский бэкэнд, который расширяет существующий и добавляет эту функциональность. Затем вы можете взаимодействовать с ним напрямую через ExtendedModelManager, который вы создаете.

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