Подтвердить что ты не робот

Как написать внешний диалект для SQLAlchemy?

Я написал минимальный диалект базы данных для SQLAlchemy, который на самом деле не принадлежит ядру. Как заставить его работать как собственный пакет Python?

4b9b3361

Ответ 1

Когда SQLAlchemy разрешает URL-адрес базы данных example://..., сначала попытается найти его в import sqlalchemy.dialects.example. Если это не работает, оно возвращается к pkg_resources.iter_entry_points('sqlachemy.databases').

Поместите новый диалект в пакет с помощью setuptools, включите точку входа, названную после вашего диалекта, запустите python setup.py develop или python setup.py install, а SQLAlchemy должен найти диалект.

В setup.py:

   entry_points = {
     'sqlalchemy.databases': ['example = example_sa:base.dialect',]
   },

example_sa:base.dialect означает import example_sa; return example_sa.base.dialect.

После установки этого пакета pkg_resources.iter_entry_points(group) выводит pkg_resources.EntryPoint экземпляры из group. Вызовите .load() на EntryPoint с помощью entrypoint.name='example', и вы получите example_sa.base.dialect.

Я был приятно удивлен, насколько легко писать новые диалекты для SQLAlchemy 0.6. Если у вашей базы данных всего несколько причуд по сравнению со стандартным SQL, скорее всего, вы сможете наследовать от стандартного (MySQL-подобного) SQL-диалекта, определить ключевые слова базы данных и скопировать реализацию этих причуд (например, SELECT TOP 10 вместо из SELECT ... LIMIT 10) из существующего диалекта.

Ответ 2

Начиная с SQLAlchemy 0.8, вы можете зарегистрировать диалекты в процессе работы без необходимости отдельной установки.

from sqlalchemy.dialects import registry
registry.register("mysql.foodialect", "myapp.dialect", "MyMySQLDialect")

Выше ответит create_engine("mysql+foodialect://") и загрузит класс MyMySQLDialect из модуля myapp.dialect.

См.: https://docs.sqlalchemy.org/en/latest/core/connections.html#registering-new-dialects.

Ответ 3

По крайней мере, в SQLAlchemy 5.x вы можете просто оставить свой драйвер/диалект в каталоге баз данных, где бы вы ни находились в вашей системе (если вы установили из источника, это может быть/usr/local/lib/python2.7/dist-packages/SQLAlchemy-0.5.8-py2.7.egg/sqlalchemy/databases)