Изменить предложение DEFAULT при создании таблицы - PullRequest
2 голосов
/ 06 марта 2012

У нас есть небольшой фрагмент кода, который копирует (части) исходную базу данных (в нашем случае 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), но я бы предпочел более общее решение.

Ответы [ 2 ]

1 голос
/ 13 марта 2012

Есть другое решение, но испортите его, и ваша база данных станет непригодной для использования.Это будет работать, но не рекомендуется.SQLite хранит схему в таблице с именем sqlite_master.Вы не можете нормально писать в эту таблицу, но, используя pragma writable_schema=on, вы можете писать.Сделайте любые изменения, которые вы хотите, а затем выключите прагму.Наконец, чтобы убедиться, что вы не вызываете проблем, поскольку схема была изменена под SQLite, закройте базу данных и снова откройте ее.

1 голос
/ 08 марта 2012

Вы также можете реализовать функцию GETUTCDATE для вашего соединения SQLite.

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