如何为SQLAlchemy编写外部方言?

21

我为SQLAlchemy编写了一个最小的数据库方言,但它并不真正属于核心部分。我该如何将其作为独立的Python包运行?


1
我对编写一个最小的数据库方言也很感兴趣 - 只是为了模拟真实的数据库。你能提供任何有帮助的指导吗? - uuu777
@zzz777 数据库方言将SQLAlchemy命令转换为每个数据库不同的SQL语句,就像SELECT TOP 10 * FROM table或SELECT * FROM table LIMIT 10之间的差异一样。如果您想创建一个方言,请先阅读现有的方言。例如,您可以向方言提供数据库的保留字列表。 - joeforker
3个回答

21

从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


17

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

将新的方言放入一个使用setuptools的包中,包含以您的方言命名的入口点,运行python setup.py developpython 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)。


1
在SQLAlchemy 0.5中,入口点称为sqlalchemy.databases。 - pi.

-1

至少在SQLAlchemy 5.x中,您可以将驱动程序/方言放入数据库目录中,该目录在您的系统上的位置为(如果您从源代码安装,则可能为/usr/local/lib/python2.7/dist-packages/SQLAlchemy-0.5.8-py2.7.egg/sqlalchemy/databases)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接