1

Today i am using the sql_debug(True) that helps me to see the queries but without the values.

How could i see how ponyorm translate the query with values ?

Thank you very much. This is an example of query i'm using.

    with db_session:
    access = select(p for p in Access if raw_sql('( lower(first_name) = lower($first_name) and  lower(last_name) = lower($last_name) ) '
                                                            'or ( lower(first_name) = lower($last_name) and lower(last_name) = lower($first_name) ) '
                                                            'or (lower(facebook_url) = lower($facebook_url)) '
                                                            'or (lower(twitter_url) = lower($twitter_url)) '
                                                            'or (lower(linkedin_url) = lower($linkedin_url)) '))
        .order_by(desc(Access.twitter_url),desc(Access.facebook_url),desc(Access.linkedin_url),
                  desc(Access.facebook_url))
print(access.get_sql())
4

3 回答 3

0

我用

logging.getLogger(__name__).debug('SQL:\n\n\t\t\t%s\n', '\n'.join(unicode(x) for x in request._construct_sql_and_arguments()[:2]).replace('\n', '\n\t\t\t'))

为了那个原因。例如,

19:30:01.902 data.py:231 [DEBUG]  SQL:

        SELECT "x"."_id", "x"."filename", "x"."_created", "x"."_updated"
        FROM "reports" "x"
        WHERE "x"."_id" <= ?
          AND "x"."_created" >= ?
        (50, '2019-04-17 19:30:01.900028')

将被打印出来。

于 2019-04-24T17:32:55.833 回答
0

您可以使用set_sql_debug(debug=True, show_values=True).

参考这里

于 2020-03-12T07:58:09.140 回答
-1

有一种方法叫get_sql()

query_obj = select(c for c in Category if c.name.startswith('v'))
sql = query_obj.get_sql()
print(sql)

输出:

SELECT "c"."id", "c"."name"
FROM "category" "c"
WHERE "c"."name" LIKE 'v%%'

代码继续:

for obj in query_obj:
    print('id:', obj.id, 'name:', obj.name)

输出:

id: 1 name: viki

这是文档的链接https://docs.ponyorm.com/api_reference.html#Query.get_sql

您可以记录 sql 或简单地打印它。

更新:

OP更新了问题:

如果 sql 查询有一个变量,就像$name它作为 sql 参数传递一样。

first_name = 'viki'
query = select(c for c in Category if raw_sql('( lower(name) = lower($first_name))'))
query.get_sql()

soget_sql()将返回带有占位符的值,输出将如下所示:

 'SELECT "c"."id", "c"."name", "c"."age"\nFROM "Category" "c"\nWHERE ( lower(name) = lower(?))'

如果我们不希望查询中出现占位符,那么我们可以避免将直接 sql 传递给查询,而是在 python 中单独构建它。

像这样:

query = select(c for C in Category if c.name == 'viki')
query.get_sql()

输出:

'SELECT "c"."id", "c"."name", "c"."age"\nFROM "Category" "c"\nWHERE "c"."name" = \'viki\''
于 2017-02-21T13:20:22.613 回答