4

データベース テーブルを定義し、Django API を介してそれらを変更する方法を探していました。

たとえば、テーブル 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 がどのように機能するかを示すおもちゃの例にすぎませんが、要点は、このようなテーブルをプログラムで作成および変更する方法があるかどうかを知りたいということです。これは、新しいテーブルを動的に作成する必要があるコンテンツ管理システムなどに役立つ場合があります。もう 1 つの例は、任意の幅のデータセットを格納するサイトで、そのためにインターフェイスまたはデータ インポートによってテーブルを動的に生成する必要があります。このようなテーブルを動的に作成および変更する良い方法を知っている人はいますか?

(確かに、データベースに対して直接 SQL ステートメントを実行できることは知っていますが、そのソリューションにはデータベースをオブジェクトとして扱う機能がありません)

人々がこれに対する提案やアプローチを持っているかどうかに興味があります...

4

2 に答える 2

2

データベース内の変更を管理する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。オブジェクトは、creationsettings.pyで使用しているデータベースに関連するデータベースバックエンドに作成されます。それらのすべてはの下にありdjango.db.backendsます。

ALTERテーブルが必要な場合は、既存のバックエンドを拡張してこの機能を追加する独自のカスタムバックエンドを作成できると思います。次に、作成したExtendedModelManagerを介して直接インターフェースできます。

于 2010-10-12T08:45:20.233 に答える
2

頭のてっぺんからすぐに..

Create/Alter メソッドを使用してカスタム マネージャーを作成します。

于 2010-10-11T21:07:55.743 に答える