如何将Redis与SQLAlchemy集成
我正在学习如何使用SQLAlchemy来连接一个SQL数据库,这个数据库有12个标准的关系表(比如SQLite或PostgreSQL)。但我还想用Python来使用Redis,特别是因为Redis在处理集合方面非常快。我知道Redis是NoSQL数据库,但我能不能把它和SQLAlchemy结合起来,这样就能利用SQLAlchemy在会话和线程处理上的优势呢?
有没有Redis的SQLAlchemy方言?我找不到,这可能意味着我错过了一些基本的知识。我应该考虑更好的架构来同时使用两种不同类型的数据库吗?
2 个回答
Redis在存储键值对和进行简单的原子操作方面表现得非常出色,但如果你想把它当作关系数据库来用,那你真的会遇到很多麻烦!我就是这样经历过的,下面是我的故事……
我曾经尝试过这样的做法,创建了几个对象来封装Redis的内部操作,提供一些基本的查询功能(我在代码里称之为过滤器),包括获取、设置、更新等方法,这些其实和ORM(对象关系映射)能做的差不多。实际上,如果你只是在本地使用Redis,你不会感觉到应用的慢,但一旦你尝试把数据库迁移到其他主机上,就会遇到很多网络传输方面的问题。最后,我不得不重新修改了一堆使用Redis和它的管道的类,这样我的程序速度提高了900%,在本地网络中变得可用。不过,现在我开始把我的数据库库迁移到Postgres了。
这个故事的教训就是:永远不要试图用键值模型来做关系数据库。虽然在基本操作上表现很好,但缺乏在服务器上建立关系的能力会带来很高的成本。
回到你的问题,我不知道有没有项目在为Redis做一个适配器来支持SQLAlchemy,我觉得可能也没有人会对这样的事情特别感兴趣,因为每个项目的性质都不一样。
虽然可以设置一个ORM(对象关系映射)来把数据放到redis里,但这并不是个好主意。ORM的设计是为了使用标准的SQL功能。而在SQL中,像随意查询某些列这样的功能是很常见的,但在redis中,如果不做很多额外的工作,这些功能是用不了的。同时,redis有一些在标准SQL中没有的功能,比如集合操作,这些功能ORM也无法使用。
所以,最好的办法是直接写代码和redis进行交互,而不是试图使用不合适的抽象工具。一般来说,你会发现从redis中获取数据的代码要比使用ORM时的SQL代码简单得多。