2011-09-15 25 views
1

我有一个应用程序需要与另一个应用程序的数据库进行交互。我有阅读权限但不能写。如何使用python有效地与另一个数据库进行交互

目前我通过pyodbc使用sql语句来抓取行并使用python来操作数据。由于我没有缓存任何东西,这可能会非常昂贵。

我想用ORM来解决我的问题。问题是如果我使用像“sql炼金术”这样的ORM,它是否足够聪明,可以在其他数据库中找到变化?

E.g. sql炼金术访问一个表并检索一行。如果该行在sql炼金术之外被修改了,它会足够聪明地拿起它吗?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

编辑:为了更清晰

我有一个应用程序是一个简单的报告工具,让我们称之为应用A.

我有一个处理名为app B.各种金融交易的其他应用程序

一个访问B的数据库检索交易,并生成各种报表。有成千上万的交易。我们目前正在python中手动缓存这些信息,如果我们需要刷新缓存的更新报告。如果我们摆脱了缓存,那么与查询结合的sql查询将变为不可缩放的。

+0

究竟是什么问题?你想达到什么目的?你想保持数据库之间的同步数据? – hymloth

+0

这些对象是否有'last_modified'列?你可以利用这个... – plaes

回答

2

我不认为ORM是解决您的性能问题的方法。默认情况下,ORM往往效率低于行SQL,因为它们可能会获取您不打算使用的数据(例如,只需要一个字段时执行SELECT *),尽管SQLAlchemy允许对生成的SQL进行细粒度控制。

现在要实现缓存机制,根据您的应用程序,您可以在内存或专用系统(如memcached或Redis)中使用简单字典。

为了让您的缓存数据保持新鲜度,您可以定期轮询源代码,如果您的应用程序可以容忍一点延迟,这可能是确定的。否则,当更新发生时,您需要具有写入数据库权限的应用程序来通知应用程序或缓存系统。

编辑:由于您似乎可以控制应用程序B,并且您已经在应用程序A中拥有缓存系统,解决问题的最简单方法可能是在应用程序A中创建一个应用程序B可以调用的回调过期缓存的项目。这两款应用程序都需要就约定识别缓存项目达成一致。

+0

感谢您的回应,我编辑了我的回复,希望它稍微更清晰。 –

+2

没有关于数据库更改通知的神奇方式。重新获取您访问的每条记录(通过SQLAlchemy或其他方式)很可能过于浪费。某些数据库允许SP和触发器访问文件或套接字等东西(Oracle具有DBMS_PIPE,Postgres具有DMBS_PIPE和Listen/Notify,不知道MySQL)。将触发器添加到发送通知的B数据库可以解决此问题。 – 9000

相关问题