【问题标题】:how to see full query with values in ponyorm如何查看带有 ponyorm 值的完整查询
【发布时间】:2017-02-21 12:56:13
【问题描述】:

今天我正在使用 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())

【问题讨论】:

    标签: python postgresql orm ponyorm


    【解决方案1】:

    我用

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

    将被打印出来。

    【讨论】:

      【解决方案2】:

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

      参考here

      【讨论】:

        【解决方案3】:

        有一个方法叫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\''
        

        【讨论】:

        • 非常感谢,但它仍然没有显示值,我想要最终的 sql 结果和值。 SELECT "c"."id", "c"."name" FROM "category" "c" WHERE "c"."name" LIKE 'some value'
        • @Yan 不是在 sql 中完全做到了WHERE "c"."name" LIKE 'v%%' 吗?
        • 确实如此。但我想查看值而不是 'v%%'
        • @Yan 我的朋友 'v%%' 是价值。如果您输入查询if c.name == 'viki',那么您将获得类似"c"."name" = 'viki' 的输出。我希望你明白这一点。如果不是,请尽可能详细地举例说明。并将其添加到问题中。
        • nop,我没有显示 'viki' 我做到了,我看到了:lower(%(p1)s) and lower(last_name) = lower(%(p2)s) ) 或 (较低的(名字)=较低的(%(p3)s............
        猜你喜欢
        • 2011-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-19
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多