【问题标题】:Django set Storage Engine & Default CharsetDjango 设置存储引擎和默认字符集
【发布时间】:2023-03-30 13:04:01
【问题描述】:

从我的models.py 创建我的表。我不知道如何做两件事 -

  1. 我想指定MySQL 将我的一些表创建为InnoDB 和一些MyISAM。我该怎么做?
  2. 我还想将我的表DEFAULT CHARSET 指定为utf8。我该怎么做?

这是我在运行syncdb 时看到的 -

...
) ENGINE=MyISAM DEFAULT CHARSET=latin1

我使用 Ubuntu 10.04、Django 1.2.X、MySQL 5.1.X

更新: 我认为这些可能是 MySQL 默认设置,我最终更改了 my.cnf,我在其中添加了 default-character-set = utf8。但是没有用。

【问题讨论】:

    标签: mysql django django-models character-encoding storage-engines


    【解决方案1】:

    我不认为您可以逐个表更改存储引擎,但您可以逐个数据库更改存储引擎。当然,这意味着 InnoDB 外键约束不能应用于 MyISAM 表的外键。

    所以你需要声明两个“数据库”,它们很可能在同一台服务器上:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            #...
        }
        'innodb': {
            'ENGINE': 'django.db.backends.mysql',
            #...
            'OPTIONS': { 'init_command': 'SET storage_engine=INNODB;' }
        }
    }
    

    您只需将using('innodb') 应用于 InnoDB 领域中表的查询集。

    对于 UTF-8,我认为您需要在数据库级别执行此操作。我不认为syncdb 为您创建数据库,只是为您创建表格。无论如何,您都应该手动创建数据库,这样您就可以在运行syncdb 之前设置权限。您想要的数据库创建命令是:

    CREATE DATABASE django CHARACTER SET utf8;
    

    也就是说,我通常建议人们在数据库中创建两个 django 用户:一个用于数据库架构工作(“admin”),另一个用于其他所有工作(使用不同的密码):

    CREATE DATABASE django CHARACTER SET utf8;
    CREATE USER 'django_site'@'localhost' IDENTIFIED BY 'password';
    GRANT SELECT, INSERT, UPDATE, DELETE ON django.* TO django_site;
    CREATE USER 'django_admin'@'localhost' IDENTIFIED BY 'password';
    GRANT SELECT, INSERT, UPDATE, DELETE ON django.* TO django_admin;
    GRANT CREATE, DROP, ALTER, INDEX, LOCK TABLES ON django.* TO django_admin;
    FLUSH PRIVILEGES;
    

    (请注意,每个数据库都需要这样做。)

    为此,您需要修改manage.py

    import sys
    if len(sys.argv) >= 2 and sys.argv[1] in ["syncdb", "dbshell", "migrate"]:
        os.environ['DJANGO_ACCESS'] = "ADMIN"
    

    然后在您的settings.py 中,使用环境变量选择正确的设置。确保站点(即非管理员)用户是默认用户。

    (另外,我没有在settings.py 中存储数据库设置SECRET_KEY 或任何其他敏感信息,因为我的Django 项目存储在Mercurial 中;我有settings.py 从可访问的外部文件中提取所有内容仅由 Django 的用户和服务器管理员提供。我将把“如何”作为练习留给读者……因为我在回答其他人的问题时详细说明了其中的一些内容,我懒得去查找它了现在。)

    【讨论】:

    • 嗯,你可以在一个数据库中混合使用 InnoDB 和 MyISAM。当我的一些外键没有被强制执行并且其中一些被强制执行时,我很难学会这一点。因此,将 MySQL 默认表类型设置为 InnoDB 是一个好主意。否则,如果您忘记转储此信息,即使转储和后续重新加载也会更改表类型。
    • 你能解释一下using('innodb')是什么意思以及在哪里添加它吗?
    • A QuerySet 默认使用settings.DATABASES['default'] 中指定的数据库。要使用不同的数据库(例如上面示例中名为 'innodb' 的数据库),您需要在 QuerySet 上调用 using 函数(例如 Foo.objects.filter(...).using('innodb'))。
    【解决方案2】:
    CREATE TABLE IF NOT EXISTS `users` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `firstname` varchar(32) NOT NULL,
      `lastname` varchar(32) NOT NULL,
      `gender` varchar(6) NOT NULL,
      `email` varchar(32) NOT NULL,
      `username` varchar(32) NOT NULL,
      `password` varchar(32) NOT NULL,
      `created` datetime NOT NULL,
      `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=76 ;
    

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 2011-01-18
      • 1970-01-01
      • 2011-12-04
      • 2011-07-13
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多