1

日付フィールドの形式を含むフィールドを日付ベースモデルに追加した後、問題が発生します。

このような:

date_format = models.CharField(max_length=32, default='%B %Y')

ただし、同じ移行では、デフォルト値を持ついくつかのブール値がありました。問題をさらに深く掘り下げ、テストデータベースを何度も再構築します。

問題は、percentgae記号が含まれるデフォルト値を持つテーブル内の移行にあります。したがって、このフィールド自体を使用した移行ではなく、同じテーブルへの移行(2番目の回答を参照)

次のようなフィールドを追加します。

show_category_name  = models.BooleanField(default=True)

自動schememigrationを使用すると、次の行の移行ファイルが作成されます。

 # -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models


class Migration(SchemaMigration):

    def forwards(self, orm):
        # Adding field 'NewsItemCategory.show_category_name'
        db.add_column('iamweb_newsitemcategory', 'show_category_name',
                      self.gf('django.db.models.fields.BooleanField')(default=True),
                      keep_default=False)

この問題を与えます:

    bin/django migrate iamwebdjango.db.backends DEBUG (0.006) SELECT "south_migrationhistory"."id", "south_migrationhistory"."app_name", "south_migrationhistory"."migration", "south_migrationhistory"."applied" FROM "south_migrationhistory" WHERE "south_migrationhistory"."applied" IS NOT NULL ORDER BY "south_migrationhistory"."applied" ASC; args=()
Running migrations for iamweb:
 - Migrating forwards to 0020_auto__add_field_newsitemcategory_show_category_name__add_field_weblink.
 > iamweb:0020_auto__add_field_newsitemcategory_show_category_name__add_field_weblink
django.db.backends DEBUG (0.277) CREATE TABLE ROLLBACK_TEST (X INT); args=()
django.db.backends DEBUG (0.008) INSERT INTO ROLLBACK_TEST (X) VALUES (8); args=()
django.db.backends DEBUG (0.001) SELECT COUNT(X) FROM ROLLBACK_TEST; args=()
django.db.backends DEBUG (0.273) DROP TABLE ROLLBACK_TEST; args=()
django.db.backends DEBUG (0.177) CREATE TABLE STDDEV_TEST (X INT); args=()
django.db.backends DEBUG (0.000) SELECT STDDEV(*) FROM STDDEV_TEST; args=()
django.db.backends DEBUG (0.160) DROP TABLE STDDEV_TEST; args=()
django.db.backends DEBUG (0.151) CREATE TABLE DDL_TRANSACTION_TEST (X INT); args=()
django.db.backends DEBUG (0.000) CREATE TABLE DDL_TRANSACTION_TEST (X INT); args=()
django.db.backends DEBUG (0.155) DROP TABLE DDL_TRANSACTION_TEST; args=()
django.db.backends DEBUG (0.000) PRAGMA table_info("iamweb_newsitemcategory"); args=()
django.db.backends DEBUG (0.000) PRAGMA index_list("iamweb_newsitemcategory"); args=()
django.db.backends DEBUG (0.000) PRAGMA index_info("sqlite_autoindex_iamweb_newsitemcategory_1"); args=()
django.db.backends DEBUG (0.000) PRAGMA index_list("iamweb_newsitemcategory"); args=()
django.db.backends DEBUG (0.000) PRAGMA index_info("sqlite_autoindex_iamweb_newsitemcategory_1"); args=()
django.db.backends DEBUG (0.000) PRAGMA table_info("iamweb_newsitemcategory"); args=()
south DEBUG execute "CREATE TABLE "_south_new_iamweb_newsitemcategory" ("date_format" varchar(32) DEFAULT '%B %Y', "show_category_name" bool NOT NULL DEFAULT 1, "id" integer PRIMARY KEY, "menu_index" integer NOT NULL UNIQUE, "name" varchar(64) NOT NULL)" with params "[]"
 ! Error found during real run of migration! Aborting.

 ! Since you have a database that does not support running
 ! schema-altering statements in transactions, we have had 
 ! to leave it in an interim state between migrations.

! You *might* be able to recover with:
 ! The South developers regret this has happened, and would
 ! like to gently persuade you to consider a slightly
 ! easier-to-deal-with DBMS (one that supports DDL transactions)
 ! NOTE: The error which caused the migration to fail is further up.
Error in migration: iamweb:0020_auto__add_field_newsitemcategory_show_category_name__add_field_weblink
Traceback (most recent call last):
  File "bin/django", line 33, in <module>
    djangorecipe.manage.main('palmrif.developmentsettings')
  File "/media/storage/django/sites/palmrif/eggs/djangorecipe-0.20-py2.7.egg/djangorecipe/manage.py", line 16, in main
    management.execute_manager(mod)
  File "/media/storage/django/sites/palmrif/parts/django/django/core/management/__init__.py", line 438, in execute_manager
    utility.execute()
  File "/media/storage/django/sites/palmrif/parts/django/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/media/storage/django/sites/palmrif/parts/django/django/core/management/base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/media/storage/django/sites/palmrif/parts/django/django/core/management/base.py", line 220, in execute
    output = self.handle(*args, **options)
  File "/media/storage/django/sites/palmrif/eggs/South-0.7.6-py2.7.egg/south/management/commands/migrate.py", line 108, in handle
    ignore_ghosts = ignore_ghosts,
  File "/media/storage/django/sites/palmrif/eggs/South-0.7.6-py2.7.egg/south/migration/__init__.py", line 213, in migrate_app
    success = migrator.migrate_many(target, workplan, database)
  File "/media/storage/django/sites/palmrif/eggs/South-0.7.6-py2.7.egg/south/migration/migrators.py", line 235, in migrate_many
    result = migrator.__class__.migrate_many(migrator, target, migrations, database)
  File "/media/storage/django/sites/palmrif/eggs/South-0.7.6-py2.7.egg/south/migration/migrators.py", line 310, in migrate_many
    result = self.migrate(migration, database)
  File "/media/storage/django/sites/palmrif/eggs/South-0.7.6-py2.7.egg/south/migration/migrators.py", line 133, in migrate
    result = self.run(migration)
  File "/media/storage/django/sites/palmrif/eggs/South-0.7.6-py2.7.egg/south/migration/migrators.py", line 107, in run
    return self.run_migration(migration)
  File "/media/storage/django/sites/palmrif/eggs/South-0.7.6-py2.7.egg/south/migration/migrators.py", line 81, in run_migration
    migration_function()
  File "/media/storage/django/sites/palmrif/eggs/South-0.7.6-py2.7.egg/south/migration/migrators.py", line 57, in <lambda>
    return (lambda: direction(orm))
  File "/media/storage/django/sites/palmrif/local_checkouts_dev/iamweb/iamweb/migrations/0020_auto__add_field_newsitemcategory_show_category_name__add_field_weblink.py", line 14, in forwards
    keep_default=False)
  File "/media/storage/django/sites/palmrif/eggs/South-0.7.6-py2.7.egg/south/db/sqlite3.py", line 31, in add_column
    field.column: self._column_sql_for_create(table_name, name, field, False),
  File "/media/storage/django/sites/palmrif/eggs/South-0.7.6-py2.7.egg/south/db/generic.py", line 44, in _cache_clear
    return func(self, table, *args, **opts)
  File "/media/storage/django/sites/palmrif/eggs/South-0.7.6-py2.7.egg/south/db/sqlite3.py", line 103, in _remake_table
    ", ".join(["%s %s" % (self.quote_name(cname), ctype) for cname, ctype in definitions.items()]),
  File "/media/storage/django/sites/palmrif/eggs/South-0.7.6-py2.7.egg/south/db/generic.py", line 273, in execute
    cursor.execute(sql, params)
  File "/media/storage/django/sites/palmrif/parts/django/django/db/backends/util.py", line 38, in execute
    sql = self.db.ops.last_executed_query(self.cursor, sql, params)
  File "/media/storage/django/sites/palmrif/parts/django/django/db/backends/__init__.py", line 505, in last_executed_query
    return smart_unicode(sql) % u_params
TypeError: not enough arguments for format string

私は南0.7.6を使用しています。奇妙なことに、このバージョンではこのバグが修正されているはずです。リリースノート0.7.6を参照してください。バグ修正sqliteのデフォルトのブール値

sqlite3、python 2.7.2、django 1.3.1を使用します(ちなみに、mySqlを使用した本番環境では、sqliteのテストデータベースは非常に便利です)

問題は、移行ファイルの14行目(次の行)を参照していることに注意してください。

        db.add_column('iamweb_newsitemcategory', 'show_category_name',
                  self.gf('django.db.models.fields.BooleanField')(default=True),
                  keep_default=False)

十分な議論がありません....初心者にとってはうまくいきます:私はこの行を作成しませんでした、サウスは作成しました:)

デバッグ行の最後の行(スタックトレースの前は次のとおりです)があるため、スタックトレースは少し混乱します。

south DEBUG execute "CREATE TABLE "_south_new_iamweb_newsitemcategory" ("date_format" varchar(32) DEFAULT '%B %Y', "show_category_name" bool NOT NULL DEFAULT 1, "id" integer PRIMARY KEY, "menu_index" integer NOT NULL UNIQUE, "name" varchar(64) NOT NULL)" with params "[]"

したがって、この実行コマンドの'%B%Y'のために、Southがまだ文字列を解析したいと考えていることに関係している可能性があります。

この問題に4日間苦労した後(もちろんフルタイムではありません)、私は南の道を疑うようになりました....しかし、これ以上の選択肢は見つかりませんでした。

4

3 に答える 3

1

Southメーリングリストで回答しました。要約すると、ブール値は無実であり、パーセントは有罪であり、Sqlite はおもちゃであり、その結果、その South バックエンドは少しおかしく、明らかにバグがあります。South の新しい今後のバージョンでは、デフォルトをデータベースに保存しないようにする必要があります。これにより、問題が解決される可能性があります (少なくともテストでは)。

チケット #317 は関係ありません。現状では、チケット #1192 は、現在プル リクエストにあるコードで修正する必要があります (または、私のフォークhttps://bitbucket.org/shaib/southから選択できます)。

于 2012-12-31T18:44:58.950 に答える
0

ああ、問題は '%B %Y' のデフォルト値にないのかもしれません。(したがって、質問とタイトルを編集しました)sqliteのデフォルトのブール値に問題があるようです。質問の私の編集を参照してください。また、ブール値は True と false のデフォルトをサポートしていません。南チケットを見る

移行ファイルで推奨される解決策は次のとおりです。

 if db.backend_name == "sqlite3":
   default = 1
else:
   default = True
db.add_column('node_entry', 'visible', self.gf('django.db.models.fields.BooleanField')(default=default), keep_default=False)

しかし、これは機能しません。さらに読むと、私が使用している南バージョンで解決されているはずです...

于 2012-09-18T13:32:57.833 に答える
0

問題がデフォルト値 '%B %Y' にあることは確かです。その移行はうまくいきましたが、その後、新しい移行はうまくいきませんでした。デフォルトをtrueにしたいブール値のフィールドが3つあったため、わかりました。そのうちの 2 つは、このパーセンテージが別のフィールドにあるテーブルにありました。これらの 2 つの移行にマークを付けたところ、残った 1 つだけが正常に実行されました。

問題は、パーセント記号を使用してテーブルを再作成することです

トラックを参照してください:

   File "/media/storage/django/sites/palmrif/eggs/South-0.7.6-py2.7.egg/south/db/sqlite3.py", line 31, in add_column
    field.column: self._column_sql_for_create(table_name, name, field, False),
  File "/media/storage/django/sites/palmrif/eggs/South-0.7.6-py2.7.egg/south/db/generic.py", line 44, in _cache_clear
    return func(self, table, *args, **opts)
  File "/media/storage/django/sites/palmrif/eggs/South-0.7.6-py2.7.egg/south/db/sqlite3.py", line 103, in _remake_table
    ", ".join(["%s %s" % (self.quote_name(cname), ctype) for cname, ctype in definitions.items()]),

それで、南のチケットを再開して、このサイトを紹介しようと思います. そして、このチケットのタイトルを変更します。

チケットにコメントを追加しました: http://south.aeracode.org/ticket/317

于 2012-10-13T08:59:00.497 に答える