我正在编写一个django项目,它广泛使用了我写的python包(为方便起见,我们称之为foo)。
python包foo将主要包含从后端数据库中获取数据的函数和类。我想以这样的方式编写包,它不依赖于django - 并且可以在django之外的其他项目中使用。
我正在考虑编写包,以便函数接受数据库连接 - 类使用IoC进行数据库连接 - 这样,我可以从django获取数据库连接并将其传递给DBAL包 - 在使用它时django,并在使用django外部的包时通过其他方式实例化数据库连接。
我有两个问题:
答案 0 :(得分: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游标相同的属性和方法。
我要说确保对象符合您所需的界面是一个可以接受的推送用户的负担,只要您彻底记录该对象应该暴露的内容。
如果您发现这样做很有价值,您可以随时为最常用的选项提供自定义解决方法。 (例如,提供自己的游标适配器类)。