首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django按需创建/修改表

Django按需创建/修改表
EN

Stack Overflow用户
提问于 2010-10-12 04:58:07
回答 2查看 3.9K关注 0票数 4

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

例如,我想写一些代码来直接操作表DDL,并允许我以编程方式定义表或向表中添加列(而不运行syncdb)。我意识到django-south和django-evolution可能会出现在脑海中,但我并不真的认为这些工具是要集成到应用程序中并由最终用户使用的工具。相反,这些工具是用于升级数据库表的实用程序。我在找一些我可以做的事情,比如:

代码语言:javascript
复制
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语句,但该解决方案缺乏将数据库视为对象的能力)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-12 16:45:20

您可以尝试使用django的代码来管理数据库中的更改。它有一点限制(例如,就我所见,没有ALTER ),但您可以扩展它。这里有一段来自django.core.management.commands.syncdb的代码片段。

代码语言:javascript
复制
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 table,我认为您可以创建自己的自定义后端,扩展现有的后端并添加此功能。然后,您可以通过您创建的ExtendedModelManager直接与其交互。

票数 2
EN

Stack Overflow用户

发布于 2010-10-12 05:07:56

迅速地从我的脑海中消失..

使用Create/Alter方法创建自定义管理器。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3909914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档