python - Django/South "python manage.py migrate CaseReport"引发异常

标签 python django django-south

我正在尝试向现有 Django 应用程序添加 South 支持。

我做了什么:

pip install south
Add 'south' to INSTALLED_APPS in settings.py

Test that South is now there:
$ python manage.py shell
Python 2.7.5+ (default, Feb 27 2014, 19:37:08)
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import south
>>>

Also, check that South shows up in manage.py help:

python manage.py help

python manage.py syncdb

Make south manage your models:

python manage.py convert_to_south CaseReport

On other instances:
manage.py migrate app_name 0001 --fake

Make your model changes in models.py

Check what -would- happen (dry run):

python manage.py schemamigration CaseReport --auto --stdout

Run it for real:
python manage.py schemamigration CaseReport --auto

Finally:
python manage.py migrate CaseReport
...but this is tracebacking for me.  :(

我得到的回溯是:

$ python manage.py migrate CaseReport
Running migrations for CaseReport:
 - Migrating forwards to 0002_auto__add_field_casereport_date_time_of_last_update.
 > CaseReport:0002_auto__add_field_casereport_date_time_of_last_update
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/dstromberg/miniconda/envs/CaseReport/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
    utility.execute()
  File "/home/dstromberg/miniconda/envs/CaseReport/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 392, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/dstromberg/miniconda/envs/CaseReport/local/lib/python2.7/site-packages/django/core/management/base.py", line 242, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/home/dstromberg/miniconda/envs/CaseReport/local/lib/python2.7/site-packages/django/core/management/base.py", line 285, in execute
    output = self.handle(*args, **options)
  File "/home/dstromberg/miniconda/envs/CaseReport/local/lib/python2.7/site-packages/south/management/commands/migrate.py", line 111, in handle
    ignore_ghosts = ignore_ghosts,
  File "/home/dstromberg/miniconda/envs/CaseReport/local/lib/python2.7/site-packages/south/migration/__init__.py", line 220, in migrate_app
    success = migrator.migrate_many(target, workplan, database)
  File "/home/dstromberg/miniconda/envs/CaseReport/local/lib/python2.7/site-packages/south/migration/migrators.py", line 254, in migrate_many
    result = migrator.__class__.migrate_many(migrator, target, migrations, database)
  File "/home/dstromberg/miniconda/envs/CaseReport/local/lib/python2.7/site-packages/south/migration/migrators.py", line 329, in migrate_many
    result = self.migrate(migration, database)
  File "/home/dstromberg/miniconda/envs/CaseReport/local/lib/python2.7/site-packages/south/migration/migrators.py", line 133, in migrate
    result = self.run(migration, database)
  File "/home/dstromberg/miniconda/envs/CaseReport/local/lib/python2.7/site-packages/south/migration/migrators.py", line 111, in run
    if not south.db.db.has_ddl_transactions:
  File "/home/dstromberg/miniconda/envs/CaseReport/local/lib/python2.7/site-packages/django/utils/functional.py", line 49, in __get__
    res = instance.__dict__[self.func.__name__] = self.func(instance)
  File "/home/dstromberg/miniconda/envs/CaseReport/local/lib/python2.7/site-packages/south/db/generic.py", line 124, in has_ddl_transactions
    if getattr(connection.features, 'supports_transactions', True):
  File "/home/dstromberg/miniconda/envs/CaseReport/local/lib/python2.7/site-packages/django/utils/functional.py", line 49, in __get__
    res = instance.__dict__[self.func.__name__] = self.func(instance)
  File "/home/dstromberg/miniconda/envs/CaseReport/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 676, in supports_transactions
    self.connection.leave_transaction_management()
  File "/home/dstromberg/miniconda/envs/CaseReport/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 322, in leave_transaction_management
    "Transaction managed block ended with pending COMMIT/ROLLBACK")
django.db.transaction.TransactionManagementError: Transaction managed block ended with pending COMMIT/ROLLBACK

有人知道我做错了什么吗?

我在 Linux Mint 16 上使用 Django 1.6 和 Miniconda CPython 2.7.5、South 0.8.4 和 MySQL 5.5.37-0ubuntu0.13.10.1。

谢谢!

最佳答案

我遇到了同样的问题,并花了几个小时应用不同的解决方案。问题是 MySQL 用户可能没有操作表的权限,或者数据库中存在 ROLLBACK_TEST 表。我两者都有,所以也许它会对某人有所帮助:

授予用户所需的数据库权限,然后刷新权限以使权限生效:

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX 
    ON `databasename`.* TO 'username'@'ip.address' IDENTIFIED BY 'somepass';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'username'@'ip.address';

删除表 ROLLBACK_TEST(如果有):

USE databasename
DROP TABLE ROLLBACK_TEST;

然后迁移就顺利了。

关于python - Django/South "python manage.py migrate CaseReport"引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23917952/

相关文章:

python - 如何避免python类方法中的无限递归

python - Python,Eclipse中正则表达式字符串的pep8警告

django - Django 中允许空值的唯一字段

python - 如何在 Heroku Django 上安装 PyMuPDF

django - 测试使用南迁移的 Django 应用程序

python - 在现有 Django 应用程序中更改主键的最佳方法是什么?

python - 如何使用 AJAX 将图像上传到 Google 云存储?

Django 模型 - 共享公共(public)基类的不同对象类型的外键

mysql - Django——由于 MySQL 连接不良导致 SyncDB 和 South 迁移失败

python - 在 OpenCV -Python 中查找图像的方差