У нас есть небольшой фрагмент кода, который копирует (части) исходную базу данных (в нашем случае MSSQL) в целевую базу данных (в нашем случае SQLite в памяти) с использованием SQLAlchemy. В рамках этого копирования мы копируем информацию таблицы из источника в цель:
for table in source:
table.tometadata(metadata_target)
# some more stuff (hack: could alter table here)
metadata_target.create_all()
При копировании таблицы предложения DEFAULT
дословно копируются. Например. скопированный столбец в SQLite может выглядеть так:
CREATE TABLE "TableName" (
-- ...
"TimeStamp" DATETIME DEFAULT (GETUTCDATE()) NOT NULL,
-- ...
)
Это не работает, потому что GETUTCDATE()
не является функцией в SQLite.
Я ищу хук в компиляторе SQLAlchemy DDL (я думаю), где я могу либо изменить, либо подавить генерацию части DEFAULT
в зависимости от значения и диалекта (ов) (например, заменить GETUTCDATE()
на DATE('now')
или полностью исключить предложение по умолчанию с NEWID()
).
Я видел эту часть документации (мы используем ее для обработки определенных типов во время кросс-компиляции), но я не знаю, как использовать ее для обработки предложения DEFAULT
. Я даже не уверен, что это правильный инструмент. Я могу решить эту проблему (изменив таблицу после «создания» с помощью SQLAlchemy), но я бы предпочел более общее решение.