2017-01-09 60 views
1

我正在写一个django项目,它广泛使用了我正在编写的python包(为方便起见我们称之为foo)。开发一个使用第三方DBAL包的Django项目

python软件包foo将主要包含从后端数据库获取数据的函数和类。我想以这样一种方式编写包,使其不依赖于django - 并且可以在django之外的其他项目中使用。

我正在考虑编写软件包,以便函数接受数据库连接 - 并且类使用IoC作为数据库连接 - 这样,我可以从django获取数据库连接并将其传递给DBAL包 - 使用它时在django中,当在django外部使用该包时,通过其他方式实例化数据库连接。

我有两个问题:

  1. 这是处理这个问题(即无陷阱)
  2. 在哪里/我如何获得的Django内的数据库连接的一种可接受的方式?

回答

0

您可以从Django的一个光标对象,像这样:

from django.db import connection 

def my_custom_sql(self): 
    with connection.cursor() as cursor: 
     cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz]) 
     cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz]) 
     row = cursor.fetchone() 

    return row 

这个例子是从自己的文件采取自定义的SQL查询here

在被写一个能够接受的方式条款包,当然。首先,它只是一个宽松的Dependency Injection,使得单元测试更容易。

唯一的问题是你的包的用户传入的游标可能不会呈现相同的接口。 SQLAlchemy游标可能不具有与Django ORM游标相同的属性和方法。

我会说确保对象符合您所需的接口是一个可接受的负担推到用户,只要你彻底记录什么对象应该公开。

如果您发现这样做会很有价值,您可以随时为最受欢迎的选项提供自定义解决方法。 (例如提供您自己的游标适配器类)。

相关问题