Saya tidak berpikir Anda dapat mengubah mesin penyimpanan berdasarkan tabel demi tabel, tetapi Anda dapat melakukannya berdasarkan database demi database. Ini, tentu saja, berarti batasan kunci asing InnoDB, misalnya, tidak dapat diterapkan ke kunci asing ke tabel MyISAM.
Jadi, Anda perlu mendeklarasikan dua "database", yang mungkin berada di server yang sama:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
#...
}
'innodb': {
'ENGINE': 'django.db.backends.mysql',
#...
'OPTIONS': { 'init_command': 'SET storage_engine=INNODB;' }
}
}
Dan Anda hanya perlu menerapkan using('innodb')
ke queryset untuk tabel di InnoDB land.
Adapun UTF-8, sekali lagi, saya pikir Anda perlu melakukan ini di tingkat database. Saya tidak berpikir syncdb
membuat database untuk Anda, hanya tabel. Anda harus tetap membuat database secara manual, sehingga Anda dapat mengatur hak istimewa sebelum menjalankan syncdb
. Perintah pembuatan database yang Anda inginkan adalah:
CREATE DATABASE django CHARACTER SET utf8;
Karena itu, saya biasanya menyarankan agar orang membuat dua pengguna Django dalam basis data:satu untuk pekerjaan skema basis data ("admin") dan satu untuk yang lainnya (dengan kata sandi yang berbeda):
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;
(Perhatikan bahwa ini perlu dilakukan untuk setiap database.)
Agar ini berfungsi, Anda perlu memodifikasi manage.py
:
import sys
if len(sys.argv) >= 2 and sys.argv[1] in ["syncdb", "dbshell", "migrate"]:
os.environ['DJANGO_ACCESS'] = "ADMIN"
Kemudian di settings.py
. Anda , gunakan variabel lingkungan untuk memilih setelan yang tepat. Pastikan pengguna situs (yaitu non-admin) adalah default.
(Selain itu, saya tidak menyimpan pengaturan basis data, SECRET_KEY
, atau apa pun yang sensitif di settings.py
karena proyek Django saya disimpan di Mercurial; Saya memiliki settings.py
tarik semua itu dari file eksternal yang hanya dapat diakses oleh pengguna Django dan admin server. Saya akan meninggalkan "bagaimana" sebagai latihan untuk pembaca... karena saya merinci beberapa di antaranya sebagai jawaban atas pertanyaan orang lain, dan saya terlalu malas untuk mencarinya sekarang.)