Ich habe einen minimalen Datenbank-Dialekt für SQLAlchemy geschrieben, der nicht wirklich in den Kern gehört. Wie kann ich es als eigenes Python-Paket verwenden?Wie schreibe ich einen externen Dialekt für SQLAlchemy?
Antwort
Wenn SQLAlchemy eine Datenbank-URL example://...
auflöst, versucht es zuerst, sie in import sqlalchemy.dialects.example
zu finden. Wenn das nicht funktioniert, fällt es zurück auf pkg_resources.iter_entry_points('sqlachemy.databases')
.
Setzen Sie den neuen Dialekt in einem Paket mit setuptools
, umfasst einen Eintrittspunkt nach dem Dialekt genannt, python setup.py develop
oder python setup.py install
laufen und SQLAlchemy sollte den Dialekt der Lage zu finden.
In setup.py
:
entry_points = {
'sqlalchemy.databases': ['example = example_sa:base.dialect',]
},
example_sa:base.dialect
bedeutet import example_sa; return example_sa.base.dialect
.
Nach der Installation dieses Pakets liefert pkg_resources.iter_entry_points(group)
pkg_resources.EntryPoint
Instanzen von group
. Rufen Sie .load()
auf der EntryPoint
mit entrypoint.name='example'
und Sie erhalten example_sa.base.dialect
.
Ich war angenehm überrascht, wie einfach es ist, neue Dialekte für SQLAlchemy 0.6 zu schreiben. Wenn Ihre Datenbank im Vergleich zu Standard-SQL nur ein paar Macken hat, können Sie wahrscheinlich den SQL-Standard (MySQL-ähnlich) erben, die Schlüsselwörter Ihrer Datenbank definieren und die Implementierung dieser Macken kopieren (wie anstelle von SELECT ... LIMIT 10
)) aus einem bestehenden Dialekt.
Zumindest in SQLAlchemy 5.x können Sie einfach Ihren Treiber/Dialekt im Datenbankverzeichnis ablegen, egal wo auf Ihrem System, (wenn Sie von der Quelle installiert haben, könnte es/usr/local/lib/python2 sein. 7/dist-packages/SQLAlchemy-0.5.8-py2.7.egg/sqlalchemy/databases)
Ab SQLAlchemy 0.8 können Sie die Dialekte im Prozess registrieren, ohne dass Sie eine separate Installation benötigen.
from sqlalchemy.dialects import registry
registry.register("mysql.foodialect", "myapp.dialect", "MyMySQLDialect")
Die oben wird die MyMySQLDialect
Klasse aus dem myapp.dialect
Modul create_engine("mysql+foodialect://")
und laden antworten.
Siehe: http://sqlalchemy.readthedocs.org/en/latest/core/connections.html#registering-new-dialects
es für mich funktioniert. –
In SQLAlchemy 0.5 der Einstiegspunkt wird sqlalchemy.databases genannt –