Ответ 1
Используйте инструмент миграции, например South.
Когда я вношу изменения в свои модели (только для добавления столбца во время разработки!), Django не будет выпускать никаких операторов ALTER TABLE
для обновления базы данных. Есть ли способ, чтобы это реализовано или работало? - прочее, а затем добавление столбцов вручную?
Примечание. Я действительно не ищу решение для полной миграции, это просто то, что позволяет мне сохранять кодировку, когда я добавляю столбцы на этом пути.
Используйте инструмент миграции, например South.
Используйте python manage.py sqlclear YOURAPP
в сочетании с dumpdata
и loaddata
(упрощенная версия ответа от fish2000, которая также использует определенное приложение):
DB=/path/to/db.sqlite3
APP=YOURAPPNAME
tmpdate=$(date "+%Y%m%d-%H%M%S")
echo "+ Dumping django project database to fixture DUMP-${tmpdate}.json ..." &&\
python manage.py dumpdata $APP --format='json' --indent=4 --verbosity=1 > datadumps/DUMP-${tmpdate}.json &&\
echo '+ Backing up sqlite binary store...' &&\
cp $DB $DB.bk &&\
echo '+ Rebuilding database structure from model defs...' &&\
python manage.py sqlclear $APP &&\
echo "+ Reloading project data from fixture dump DUMP-${tmpdate}.json ..." &&\
python manage.py loaddata datadumps/DUMP-${tmpdate}.json
Прости, это немного поздно, но я подумал, что я буду публиковать его здесь в любом случае, если кто-то еще столкнется с этой проблемой. Если вы все еще находитесь в разработке, и все ваши данные являются фиктивными данными (что означает, что вы не хотите их хранить), все, что вам нужно сделать, это удалить базу данных и снова запустить syncdb.
Отметьте эволюцию http://code.google.com/p/django-evolution/
Если вы не хотите настраивать миграцию - вы можете использовать такой трюк:
export JANGY_PROJECT='/Users/fish/Dropbox/ost2/ost2'
export BPYTHON_INIT_SCRIPT='${JANGY_PROJECT}/utils/django_shell_imports.py'
export PYTHONPATH="${JANGY_PROJECT}:${PYTHONPATH}"
alias jangy="python manage.py"
alias bp="cd $JANGY_PROJECT && bpython --interactive $BPYTHON_INIT_SCRIPT"
function jangyfresh () {
tmpdate=$(date "+%Y%m%d-%H%M%S") &&\
cd $JANGY_PROJECT &&\
echo "+ Dumping django project database to fixture DUMP-${tmpdate}.json ..." &&\
python manage.py dumpdata --format='json' --indent=4 --verbosity=1 > datadumps/DUMP-${tmpdate}.json &&\
echo '+ Backing up sqlite binary store and taking database offline...' &&\
mv sqlite/data.db sqlite/data.db.bk &&\
echo '+ Rebuilding database structure from model defs...' &&\
python manage.py syncdb &&\
echo '+ Graceful-restarting Apache...' &&\
sudo apachectl graceful &&\
echo '+ Enabling write access on new sqlite file...' &&\
chmod a+rw sqlite/data.db &&\
echo "+ Reloading project data from fixture dump DUMP-${tmpdate}.json ..." &&\
python manage.py loaddata datadumps/DUMP-${tmpdate}.json &&\
echo '+ Rebuilding project database structure...'
}
... что делает эта функция bash
:
Я использую это во время разработки для резервного копирования и запуска с нуля - иногда это работает, если вы добавляете столбец, иногда он будет жаловаться на то, что во вновь определенном поле модели отсутствует столбец базы данных.
В этих случаях я запускаю команду, редактирую файл models.py
, удаляю файл sqlite и перезагружаю последний прибор.
Очевидно, я не делаю этого на производственной установке, и я бы не рекомендовал этого.