今天我使用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())
答案 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\''