Django 按需创建/更改表

标签 django ddl alter

我一直在寻找一种定义数据库表并通过 Django API 更改它们的方法。

例如,我想编写一些直接操作表 DDL 的代码,并允许我以编程方式按需定义表或向表添加列(无需运行同步数据库)。我意识到 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 如何工作的一个玩具示例,但重点是我非常有兴趣了解是否有一种方法可以以编程方式创建和更改这样的表。这对于内容管理系统等可能需要动态创建新表的系统很有用。另一个示例是存储任意宽度的数据集的站点,需要通过接口(interface)或数据导入动态生成该数据集的表。有人知道动态创建和更改这样的表的好方法吗?

(当然,我知道可以对数据库执行直接 SQL 语句,但该解决方案缺乏将数据库视为对象的能力)

只是好奇人们是否对此有任何建议或方法......

最佳答案

您可以尝试与管理数据库更改的 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_modelcreation 对象是在与您在 settings.py 中使用的数据库相关的数据库后端创建的。所有这些都位于 django.db.backends 下。

如果您必须有 ALTER 表,我认为您可以创建自己的自定义后端来扩展现有后端并添加此功能。然后您可以通过您创建的 ExtendedModelManager 直接与其交互。

关于Django 按需创建/更改表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3909914/

相关文章:

Django: 'Module' 对象没有属性 '__file__'

sql - Delete 如何既是 DDL 又是 DML 语句

sql-server - 在一个 SQL 文件中创建多个 View

mysql - 增加表中所有列的 varchar() 大小?

python - Django 中的自动更新缓存

django - 错误 : No such command 'flower' . 您的意思是其中之一吗? worker

sql - CREATE VIEW 必须是批处理中唯一的语句

mysql - 更改表添加有错误的列

mysql - MySQL 将 varchar 转换为 char 有什么作用?

Django Activity Feed(Feedly 集成?)