Я написал минимальный диалект базы данных для SQLAlchemy, который на самом деле не принадлежит ядру. Как заставить его работать как собственный пакет Python?
Как написать внешний диалект для SQLAlchemy?
Ответ 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)