如何为SQLAlchemy编写外部方言?

时间:2009-11-04 16:08:03

标签: sqlalchemy

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

3 个答案:

答案 0 :(得分:17)

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

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

以上内容将回复create_engine("mysql+foodialect://")并从MyMySQLDialect模块加载myapp.dialect类。

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

答案 1 :(得分:14)

SQLAlchemy解析数据库网址example://...时,它会首先尝试在import sqlalchemy.dialects.example中找到它。如果这不起作用,则会回退到pkg_resources.iter_entry_points('sqlachemy.databases')

使用setuptools将新方言放入包中,包含以您的方言命名的入口点,运行python setup.py developpython setup.py install,SQLAlchemy应该能够找到方言。< / p>

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方言,定义数据库的关键字,并复制这些怪癖的实现(如{{1}从现有的方言中取代SELECT TOP 10}。

答案 2 :(得分:-1)

至少在SQLAlchemy 5.x中你可以将你的驱动程序/方言放在数据库目录中,无论你的系统在哪里,(如果从源代码安装,它可能是/usr/local/lib/python2.7 /dist-packages/SQLAlchemy-0.5.8-py2.7.egg/sqlalchemy/databases)