django创建表时附加数据库自定义选项的方法——如指定数据库的存储引擎

 

    在使用django的syncdb创建表时,如果想给建表SQL附加特定的选项——比如MySQL数据库默认存储引擎是MyISAM,但想让所有新建的表都为InnoDB引擎的——可以通过增加settings.py文件里的DATABASES里的选项来实现,也可以通过自动执行initial SQL data来实现。

 

 

    一. 修改settings.py的方式


    在DATABASES字典的数据库实例中增加OPTION字典, 代码如下:

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 'NAME': 'am', # Or path to database file if using sqlite3. 'USER': 'probe', # Not used with sqlite3. 'PASSWORD': '', # Not used with sqlite3. 'HOST': 'localhost', # Set to empty string for localhost. Not used with sqlite3. 'PORT': '3306', # Set to empty string for default. Not used with sqlite3. 'OPTIONS': { 'init_command': 'SET storage_engine=INNODB', }, }, }

OPTION字典可以使用许多key,可以参考http://mysql-python.sourceforge.net/MySQLdb.html#functions-and-attributes

我们这里使用'init_command': 'SET storage_engine=INNODB'指定创建每个表时都使用INNODB引擎。

 

这个附加信息不会在python manage.py sqlall appname打印出的SQL里出现,

但我们在MySQL客户端中执行“show create table table_name;“可以看到 ……ENGINE=InnoDB ……这样的语句

 

这个方法存在的一些问题:

1. 在OPTION里增加‘use_unicode’: True , 'charset': 'gbk'这样的信息无法改变创建表的默认字符集

2. 使用'init_command': ‘SET NAMES “gbk”’ 也无法改变创建表的默认字符集

3. 找不到init_command如何使用的文档,不知道怎样使用它附加其它的选项

 

 

    二、自动执行initial SQL data的方式


使用python manage.py syncdb初始化数据库时,Django会寻找路径为 /sql/..sql的文件——如果appname是am,modelname是Student,数据库后端是django.db.backends.mysql,那么文件路径就是am/sql/student.mysql.sql(模块名Student转换成小写的student)——然后执行它。

 

可以在这个sql文件里加入这样的语句:

ALTER TABLE T_VLR_REPORT_TAB ENGINE=InnoDB DEFAULT CHARSET=gbk; INSERT INTO myapp_person (first_name, last_name) VALUES ('John', 'Lennon'); INSERT INTO myapp_person (first_name, last_name) VALUES ('Paul', 'McCartney');

初始化后,我们就可以用show create table T_VLR_REPORT_TAB; 看到存储引擎和默认字符集已经改了,同时我们也可以看到 myapp_person表里有2行数据。

 

参考链接:http://docs.djangoproject.com/en/dev/ref/databases/#connecting-to-the-database

                    http://docs.djangoproject.com/en/dev/howto/initial-data/#initial-sql

 

你可能感兴趣的:(Django)