Изменение схемы таблицы SQL с помощью web2py - PullRequest
3 голосов
/ 19 декабря 2011

У меня проблемы с изменением схемы таблицы SQL в web2py.

  1. Если я изменю тип поля существующего поля в db.define_table, новый тип столбца SQL, кажется, регистрируется в web2py, но фактически ничего не меняет в базе данных, что приводит к ошибкам.
  2. Если я опускаю поле из db.define_table, оно не исчезает в SQL.

Пример 1. Изменение типов полей

Я начинаю со таблицы примерно так:

db.define_table('dummy',
    Field('name', 'string'),
    Field('created', 'date')
    )

Если я проверяю оператор create таблицы в диспетчере SQLite, он выглядит следующим образом:

CREATE TABLE style(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name CHAR(512),
    created DATE)

Я подключил несколько записей, хотя оставил created пустым. Затем я понимаю, что хочу, чтобы created было датой и что я хочу добавить еще одно поле, modified, которое также является датой и временем. Поэтому я изменяю db.py на следующее:

db.define_table('dummy',
    Field('name', 'string'),
    Field('created', 'datetime'),
    Field('modified', 'datetime')
    )

Я не получаю ошибок изначально. Однако, если я взгляну на оператор create, я увижу следующее:

CREATE TABLE style(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name CHAR(512),
    created DATE,
    modified TIMESTAMP)

Таким образом, согласно SQLiteManager, новый столбец modified является правильным типом, но тип старого столбца created не изменился.

Если я затем зайду в администратор базы данных web2py и отредактирую строку, она будет делать вид, что и created, и modified являются datetime - когда я редактирую эти значения, это дает мне всплывающий редактор datetime. Редактирование столбца modified работает нормально, но если я редактирую created, то экран администратора базы данных больше не может выполнять базовые запросы выбора, а вместо этого выдает ошибку:

Неверный запрос недопустимый литерал для int () с основанием 10: '19 11: 33: 39 '


Пример 2: удаление полей

Наконец, допустим, я хочу удалить столбец created и начать все сначала, поэтому я исключаю его из своего кода:

db.define_table('dummy',
    Field('name', 'string'),
    Field('modified', 'datetime')
    )

Но ничего не меняется - я все еще вижу столбец created в диспетчере SQLite, и указанные выше ошибки сохраняются.


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

Как заставить web2py переопределить таблицы, удалив старые столбцы и, при необходимости, обновив типы существующих столбцов?

1 Ответ

4 голосов
/ 20 декабря 2011

SQLite является особым случаем - читайте здесь об исправлении прерванных миграций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...