如何为SQLAlchemy编写外部方言?

joe*_*ker 18 sqlalchemy

我为SQLAlchemy写了一个最小的数据库方言,它实际上并不属于核心.如何使其作为自己的Python包工作?

Sea*_*nch 18

从SQLAlchemy 0.8开始,您可以在进程中注册方言,而无需单独安装.

from sqlalchemy.dialects import registry
registry.register("mysql.foodialect", "myapp.dialect", "MyMySQLDialect")
Run Code Online (Sandbox Code Playgroud)

以上将响应  create_engine("mysql+foodialect://") 并加载 模块中的  MyMySQLDialect 类  myapp.dialect.

请参阅:http://sqlalchemy.readthedocs.org/en/latest/core/connections.html#registering-new-dialects


joe*_*ker 15

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',]
   },
Run Code Online (Sandbox Code Playgroud)

example_sa:base.dialect手段import example_sa; return example_sa.base.dialect.

安装此软件包后,从中pkg_resources.iter_entry_points(group)生成pkg_resources.EntryPoint实例group.打电话.load()EntryPointentrypoint.name='example',你会得到example_sa.base.dialect.

我惊喜地发现为SQLAlchemy 0.6编写新方言是多么容易.如果您的数据库与标准SQL相比只有几个怪癖,那么您很可能会继承标准(类似MySQL)的SQL方言,定义数据库的关键字,并复制这些怪癖的实现(比如SELECT TOP 10代替SELECT ... LIMIT 10)现有的方言.