使用South和Django显式设置MySQL表存储引擎

Ero*_*eal 20 django django-models storage-engines django-south

我遇到了一个问题,当我迁移时,南方为新模型创建了一个新表模型作为INNODB,但当另一个开发人员运行自己的迁移时,将该表创建为MYISAM.

这个问题是我的所有其他表都是MYISAM,因此使用新表会导致许多外键约束错误.

如何明确确保使用MYISAM创建表?

是什么导致在不同环境中使用不同的存储引擎创建表?

小智 23

为了确保所有迁移始终使用INNODB完成,您应该直接在数据库定义中将存储引擎设置为INNODB,如下所示:

DATABASES = {
    'default': {
        ...
        'OPTIONS'  : { 'init_command' : 'SET storage_engine=INNODB', },
    }
Run Code Online (Sandbox Code Playgroud)

如果您使用的是MySQL 5.7.x及更高版本,

DATABASES = {
    'default': {
        ...
        'OPTIONS'  : { 'init_command' : 'SET default_storage_engine=INNODB', },
    }
Run Code Online (Sandbox Code Playgroud)

但是你应该知道它可能会受到性能影响.因此,您可能只想在运行迁移时设置此选项.

  • 这正是我想要的.谢谢.为了弥补你提到的性能损失,我添加了一个条件.现在只有在我想修改数据库(syncdb或modify)时才会调用它.`import sys``如果sys.argv中的'migrate'或sys.argv中的'syncdb':` (2认同)
  • 什么是MyISAM的正确storage_engine设置?这是大写还是大小写,还是其他什么? (2认同)

dno*_*zay 14

如果使用South,则可以设置STORAGE_ENGINE.

django <1.2

# add to your settings file
DATABASE_STORAGE_ENGINE = 'INNODB' # django < 1.2
Run Code Online (Sandbox Code Playgroud)

django> = 1.2

# add to your settings file
DATABASES = {
   'default': {
       ...
       'STORAGE_ENGINE': 'INNODB'
   }
}
Run Code Online (Sandbox Code Playgroud)