【问题标题】:How to pass qs.query to a custom plpgsql function with Django ORM?如何使用 Django ORM 将 qs.query 传递给自定义 plpgsql 函数?
【发布时间】:2021-09-02 16:40:38
【问题描述】:

我有一些查询集 qs = MyModel.objects.filter(fieldname='fieldname') 和一个 custom plpgsql function my_function(),我可以在 pg_shell 中使用,例如:

SELECT my_function('SELECT * FROM my_model');

如何用 Django ORM 做到这一点?我试图:

with connection.cursor() as cursor:
    query, params = qs.query.sql_with_params()
    query = f"SELECT my_function('{query}')"
    cursor.execute(query, params)

qs.query.sql_with_params() 并不打算返回有效的 SQL。

使用 Django ORM 甚至可以实现这样的事情吗?

【问题讨论】:

    标签: python django postgresql plpgsql django-orm


    【解决方案1】:

    首先,如果你想调用函数/过程,就这样做

    from django.db import connections
    connection = connections['default']
    with connection.cursor() as cursor:
        cursor.callproc('name_of_your_function', ('SELECT * FROM some_table WHERE whatever_you_want', ))
        result = cursor.fetchone()
    

    接下来是关于来自 django orm 的真正 sql 查询,而不是带来 queryset.query 或 qs.query.sql_with_params 的糟糕查询,尤其是在您使用日期但真正的日期将传递给 psycopg 的情况下

    from .models import SomeModel
    qs = SomeModel.objects.filter(create_at__gt='2021-04-20')
    
    from django.db import connections
    conn = connections['default']
    
    from django.db.models.sql.compiler import SQLCompiler
    compiler = SQLCompiler(qs.query, conn, using=qs.using)
    
    sql, params = compiler.as_sql()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 2012-10-30
      • 1970-01-01
      • 2018-03-18
      相关资源
      最近更新 更多