如何使用 Django ORM 将 qs.query 传递给自定义 plpgsql 函数?
How to pass qs.query to a custom plpgsql function with Django ORM?
我有一些查询集 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()
并不是为了return有效SQL。
Django ORM 甚至可以实现这样的功能吗?
首先,如果你想打电话给function/procedure,就按
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()
我有一些查询集 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()
并不是为了return有效SQL。
Django ORM 甚至可以实现这样的功能吗?
首先,如果你想打电话给function/procedure,就按
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()