如何在 ponyorm 中查看带有值的完整查询
how to see full query with values in 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())
有一种方法叫做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
这里是 link 文档 https://docs.ponyorm.com/api_reference.html#Query.get_sql
您可以记录 sql 或打印它。
更新:
OP updated the question:
如果 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()
将 return 带有占位符的值,输出将如下所示:
'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\''
我用
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')
会被打印出来。
您可以使用 set_sql_debug(debug=True, show_values=True)
.
引用here.
今天我使用 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())
有一种方法叫做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
这里是 link 文档 https://docs.ponyorm.com/api_reference.html#Query.get_sql
您可以记录 sql 或打印它。
更新:
OP updated the question:
如果 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()
将 return 带有占位符的值,输出将如下所示:
'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\''
我用
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')
会被打印出来。
您可以使用 set_sql_debug(debug=True, show_values=True)
.
引用here.