как оставить вычисляемое поле в одиночку при записи в БД с помощью Elixir session.commit () - PullRequest
1 голос
/ 29 марта 2011

Я использую Elixir для подключения к базе данных MSSQL. В базе данных есть таблица с вычисляемым столбцом. Однако, когда я обновляю другие столбцы в объекте и фиксирую изменения, python говорит мне, что я не могу вставить в вычисляемый столбец.

Я использую автозагрузку в моей модели:

class Slot(Entity):
    using_options(tablename='tbScheduleSlots', autoload=True)
    using_table_options(schema='sch')

Я создаю слот и присваиваю ему некоторые значения, затем фиксирую:

ss = Slot(StartDateTime='2012-01-01 13:00:00:000', Program_ID=1234, etc)
session.commit()

Важное замечание !! Я не даю объекту ss никакого значения для EndDateTime, потому что это вычисляемое поле. Поэтому я не передаю ничего в базу данных для этого поля.

Ошибка:

sqlalchemy.exc.ProgrammingError: (ProgrammingError) ('42000', '[42000] [FreeTDS] [SQL Server] Столбец "EndDateTime" нельзя изменить, поскольку он является вычисляемым столбцом или является результатом UNION. operator. (271) (SQLPrepare) ')' INSERT INTO sch. [tbScheduleSlots] ([Program_ID], [SlotType_ID], [StartDateTime], [EndDateTime], [Duration], [Description], [Notes], [State]] , [MasterSlot_ID]) OUTPUT вставлен. [ID_ScheduleSlot] VALUES (?,?,?,?,?,?,?,?,?) '(5130, 1,' 2012-01-01 13: 00: 00: 000 ', Нет, Нет, Нет, Нет, 2, Нет)

1 Ответ

0 голосов
/ 29 марта 2011

Эххх, я не программист на Python, но похоже, что эта строка:

using_options(tablename='tbScheduleSlots', autoload=True)

, использующий автозагрузку, вероятно, добавляет [EndDateTime] в оператор INSERT (как показано в сообщении об ошибке). Похоже, что это строка, которая сообщает Python метаданные базовой таблицы (то есть полей в таблице). Ищите способ определить столбцы, которые будут обновлены вручную. Опираясь на Python для построения INSERT, кажется, автоматически включает [EndDateTime] в базовый запрос.

...