SQLite和PostgreSQL的用户定义函数?

SQLite和PostgreSQL的用户定义函数?,postgresql,sqlite,peewee,Postgresql,Sqlite,Peewee,我目前有一个SQLite用户定义函数(用Python编写) 我想支持使用PostgreSQL作为我的模拟应用程序的备用后端(允许模拟程序的多个并行执行)。我不喜欢PostgreSQL,所以我想另一个基于服务器的数据库也可以 跨多个peewee后端处理用户定义函数的最佳方法是什么 SQLite不支持SQL中的用户定义函数,我曾考虑过使用PL/python,但没有关于如何集成peewee和PL/python(以及如何将应用程序配置数据添加到PL/python函数)的详细信息 我可以有两个用户定义函数

我目前有一个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
尝试:
亲属_1=集合()
亲属_2=set()
共同的祖先=censere.models.relationshipeum.great\u great\u great\u祖父母
对于censere.models.Relationship.select(censere.models.Relationship.second)中的r1,其中(
(censere.models.Relationship.first==id_1)&

(censere.models.Relationship.Relationship如果您想支持不同的数据库系统,通常最好在应用程序中增加逻辑,而在存储函数中减少逻辑。同意@LaurenzAlbe,尽管移动到应用程序可能会降低通过网络来回传输的速度。您可能想咬一口“那些忘记了SQL(和集合论)的教训的人注定要重新实现它们……很糟糕。”SQL背后有超过40年的研究、迭代和优化。仅在PostgreSQL引擎中就有超过20年。即使只是在基本层面上,也值得学习,而不是试图将一个圆钉塞进一个方孔中。这两个注释不冲突吗?我想我将采取另一种方法,继续使用每模拟DB然后将它们合并成一个数据库进行后处理。
    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