2

南に関連付けられているこのモデルがあるとします。

class MyModel(models.Model):
    field_a = models.CharField(max_length=30)
    field_b = models.CharField(max_length=30)

後でもう 1 つのフィールドを追加したいので、その間にそのフィールドを作成しfield_afield_b今のモデルは次のようになります。

class MyModel(models.Model):
    field_a = models.CharField(max_length=30)
    field_c = models.CharField(max_length=30)
    field_b = models.CharField(max_length=30)

次に、変更を移行しました。MySQL でテーブル構造を確認するとfield_c、すべてのフィールドの最後に作成されます。フィールドの順序を維持するように南に伝えるにはどうすればよいですかfield_a

MySQL では、既存のフィールドの前後に新しいフィールドを挿入できます。南国でもそれは可能ですか?

4

3 に答える 3

7

Django(またはSouth)を使用している場合、MySQLでフィールド作成の順序を強制することはできないと思います。新しいフィールドは常にテーブル定義の最後に追加されます。

ただし、列の順序は関係ありません。読む...

データベースに対してSQLクエリを作成している場合select *、テーブルのフィールドの順序に依存して実行するのは不適切な形式です。代わりに、選択するフィールドと、それらをレポートする順序を指定する必要があります。これにより、基になるテーブルのフィールド順序は重要ではなくなります。

さらに、組織内の誰かが現在select *:を使用するレポートを作成している場合、他の列の間に新しい列を挿入すると、列のインデックスが変更されるため、(フィールド名ではなく)フィールド位置を使用するレポートを簡単に壊すことができます。

于 2013-01-07T12:42:17.987 に答える
1

Steve Mayne が言ったように、モデルを更新し続ける場合、それを行う直接的な方法はありません。ただし、それを行うためのハックがあります。

モデルを初めて作成するときは、すでに観察したように、すべての定義が次々と行われます。

新しい列を追加した後、モデルの順序を完全に確認したい場合は、MySQL シェルにログインします。これは通常、 で行われmysql -u<user> -pます。でデータベースを使用するように指示しますUSE db

次に、新しい列を手動で挿入しALTER TABLE table ADD field_c VARCHAR(30) AFTER field_aます。

MyModelこれで、クラスを編集して Django に伝えることができます。

class MyModel(models.Model):
    field_a = models.CharField(max_length=30)
    field_c = models.CharField(max_length=30)
    field_b = models.CharField(max_length=30)

明らかに、モデルが大幅に変更された場合、これは本当に面倒です。うまくいけば、それは起こりません。

于 2013-01-07T12:52:00.457 に答える
0

これが私のために働いた回避策です:

1) model.py ファイルにモデルを作成しますが、最初のフィールドのみを追加します。

2) 移行を行いますが、まだ移行しません。

3) 各フィールドを 1 つずつ追加し、それぞれの後に移行を行います。

4) それらがすべて揃ったら、移行します。

これは私にとってはうまくいきました。モデルがすでに設計されている場合は、次のことができます。

0) モデルを削除し、移行を行い、移行してから、削除を元に戻します (データが失われ、必要に応じてダンプします)。

1) 各フィールドを下から 1 つずつカット/削除しますが、最初のフィールドは削除します。

2) 移行する

3) 元に戻して 2 番目のフィールドを戻し、移行を行います。他の人についても繰り返します。

4) 最後に、移行します。

于 2015-06-02T22:03:23.220 に答える