如何从 peewee 获取 sql 查询?

How to get sql query from peewee?

简单的 peewee 示例: MySQL 具有自动增量 "id" 和字符字段 "name".

的数据库 "Pet"

正在做

my_pet = Pet.select().where(name == 'Garfield')

使用 .sql() 我们得到 sql 解释。

如何从以下位置获取原始 sql 查询:

my_pet = Pet.get(name='Garfield')

?

当你写:

my_pet = Pet(name='Garfield')

数据库中什么也没有发生。

您刚刚创建了一个对象。没有魔法,因为 peewee 是一个 ActiveRecord ORM,只有在调用 Model.save()Model.create().

等方法时才会保存

如果您希望 SQL 用于像 Model.create() 这样的查询,那么您应该考虑使用 Model.insert()

insert_stmt = Pet.insert(name='Garfield')
sql = insert_stmt.sql()
new_obj_id = insert_stmt.execute()

缺点是您不会返回模型实例,只会返回主键。

如果您要连接到 Postgres 数据库,根据 peewee 3.13,您可以打印 SQL 查询,方法是首先获取游标,然后为您的查询调用 mogrify()。 Mogrify 由 psycopg2 库提供,因此在连接到其他数据库时可能不可用。

以你的例子为例:

my_pet = Pet.select().where(Pet.name == 'Garfield').limit(1)

cur = database.cursor()
print(cur.mogrify(*my_pet.sql()))

其中 database 是表示与 Postgres 连接的 Peewee 数据库对象。

您可以使用 python 的“%”运算符来构建字符串


def peewee_sql_to_str(sql):
    return (sql[0] % tuple(sql[1]))

insert_stmt = Pet.insert(name='Garfield')
sql = insert_stmt.sql()

print(peewee_sql_to_str(sql))