Подтвердить что ты не робот

Как я могу автоматически позволить syncdb добавлять столбец (не требуется полная миграция)

Когда я вношу изменения в свои модели (только для добавления столбца во время разработки!), Django не будет выпускать никаких операторов ALTER TABLE для обновления базы данных. Есть ли способ, чтобы это реализовано или работало? - прочее, а затем добавление столбцов вручную?


Примечание. Я действительно не ищу решение для полной миграции, это просто то, что позволяет мне сохранять кодировку, когда я добавляю столбцы на этом пути.

4b9b3361

Ответ 1

Используйте инструмент миграции, например South.

Ответ 2

Используйте 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

Ответ 3

Прости, это немного поздно, но я подумал, что я буду публиковать его здесь в любом случае, если кто-то еще столкнется с этой проблемой. Если вы все еще находитесь в разработке, и все ваши данные являются фиктивными данными (что означает, что вы не хотите их хранить), все, что вам нужно сделать, это удалить базу данных и снова запустить syncdb.

Ответ 5

Если вы не хотите настраивать миграцию - вы можете использовать такой трюк:

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:

  1. Выводит базу данных в прибор, названный по дате/времени
  2. Создает резервную копию и удаляет двоичный файл базы данных (в данном случае SQLite, который сравнительно легко удаляет рассматриваемый файл)
  3. Повторная синхронизация базы данных из моделей (восстановление файла двоичной базы данных)
  4. (необязательно) Исправляет перми файлов БД (с которыми может винт dropbox, в моем случае здесь)
  5. Переполняет новую БД из последнего прибора
  6. (необязательно) перезапускает apache

Я использую это во время разработки для резервного копирования и запуска с нуля - иногда это работает, если вы добавляете столбец, иногда он будет жаловаться на то, что во вновь определенном поле модели отсутствует столбец базы данных.

В этих случаях я запускаю команду, редактирую файл models.py, удаляю файл sqlite и перезагружаю последний прибор.

Очевидно, я не делаю этого на производственной установке, и я бы не рекомендовал этого.