Это может быть немного боковой подход, но хорошая библиотека типа ORM, вероятно, сможет хотя бы скрыть различия. Например, в Ruby есть ActiveRecord (обычно используемый, но не исключительно связанный с веб-фреймворком Ruby the Rails), в котором есть Миграции. В пределах определения таблицы, которое объявлено в коде, не зависящем от платформы, детали реализации, такие как типы данных, последовательная генерация идентификаторов и создание индексов, опускаются ниже вашего видения.
Я прозрачно разработал схему на SQLite, затем реализовал ее на MS SQL Server и позже перенес в Oracle. Не изменяя код, который генерирует мое определение схемы.
Как я уже сказал, это может быть не то, что вы ищете, но самый простой способ инкапсулировать то, что меняется, - это использовать библиотеку, которая уже сделала инкапсуляцию для вас.