我为SQLAlchemy编写了一个最小的数据库方言,但它并不真正属于核心部分。我该如何将其作为独立的Python包运行?
我为SQLAlchemy编写了一个最小的数据库方言,但它并不真正属于核心部分。我该如何将其作为独立的Python包运行?
从SQLAlchemy 0.8开始,您可以在进程中注册方言,而无需进行单独的安装。
from sqlalchemy.dialects import registry
registry.register("mysql.foodialect", "myapp.dialect", "MyMySQLDialect")
上述内容将响应 create_engine("mysql+foodialect://")
,并从 myapp.dialect
模块加载 MyMySQLDialect
类。
参见:https://docs.sqlalchemy.org/en/latest/core/connections.html#registering-new-dialects
当 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)
从group
中产生pkg_resources.EntryPoint
实例。使用entrypoint.name='example'
调用EntryPoint
上的.load()
,您将获得example_sa.base.dialect
。
我惊喜地发现,在SQLAlchemy 0.6中编写新的方言是多么容易。如果您的数据库与标准SQL相比只有一些特殊情况,那么您很可能能够继承标准(类似于MySQL的)SQL方言,定义您的数据库的关键字,并从现有方言中复制这些特殊情况的实现(例如使用SELECT TOP 10
而不是SELECT ... LIMIT 10
)。
至少在SQLAlchemy 5.x中,您可以将驱动程序/方言放入数据库目录中,该目录在您的系统上的位置为(如果您从源代码安装,则可能为/usr/local/lib/python2.7/dist-packages/SQLAlchemy-0.5.8-py2.7.egg/sqlalchemy/databases)