我目前有一个SQLite用户定义函数(用Python编写)。
我想支持使用PostgreSQL作为我的模拟应用程序的备用后端(以允许多次并行执行模拟程序)。我没有被PostgreSQL束缚,所以我想另一个基于服务器的数据库也可以正常工作...
跨多个peewee后端处理用户定义函数的最佳方法是什么?
SQLite不支持SQL中的用户定义函数,我曾考虑过使用PL / python,但是没有有关如何集成peewee和PL / python(以及如何将应用程序配置数据添加到PL中)的详细信息/ python函数)
我可以有两种用户定义函数的实现(用于PostGreSQL的SQL和用于SQLite的python),但是第一步就用Python编写它的好处之一是我不必在SQL中解决它: -)
为完整起见,这里是用户定义函数的胆量,它是父查询的一部分,并传递了id_1和id_2参数。
使用python设置数学对我来说比SQL容易得多:-)
allowed = False
try:
relatives_1 = set()
relatives_2 = set()
common_ancestor = censere.models.RelationshipEnum.great_great_great_grandparent
for r1 in censere.models.Relationship.select(censere.models.Relationship.second).where(
( censere.models.Relationship.first == id_1 ) &
( censere.models.Relationship.relationship <= common_ancestor )
).tuples():
relatives_1.add( str(r1[0]) )
for r2 in censere.models.Relationship.select(censere.models.Relationship.second).where(
( censere.models.Relationship.first == id_2 ) &
( censere.models.Relationship.relationship <= common_ancestor )
).tuples():
relatives_2.add( str(r2[0]) )
if relatives_1 == relatives_2:
allowed = False
if len(relatives_1 & relatives_2) == 0:
allowed = True
except Exception as e:
logging.log( logging.ERROR, 'Caught exception %s', str(e) )
return allowed