用户定义的SQLite和PostgreSQL函数?

时间:2019-12-18 15:30:54

标签: postgresql sqlite peewee

我目前有一个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

0 个答案:

没有答案