如何在ponyorm中查看值的完整查询

时间:2017-02-21 12:56:14

标签: python postgresql orm ponyorm

今天我使用sql_debug(True)帮助我查看查询但没有值。

我怎么能看到ponyorm如何用值翻译查询?

非常感谢你。 这是我正在使用的查询示例。

    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())

3 个答案:

答案 0 :(得分: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')

将被打印出来。

答案 1 :(得分:0)

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

参考here

答案 2 :(得分:-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()

所以get_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\''