Python 如何从peewee获取sql查询?

Python 如何从peewee获取sql查询?,python,python-3.x,peewee,Python,Python 3.x,Peewee,简单的peewee示例: MySQL DB“Pet”,具有自动递增的“id”和字符字段“name” 做 my_pet = Pet.select().where(name == 'Garfield') 使用.sql()可以得到sql解释 如何从以下位置获取原始sql查询: my_pet = Pet.get(name='Garfield') 当你写作时: my_pet = Pet(name='Garfield') 数据库中什么也没有发生 您只是创建了一个对象。这没有什么神奇之处,因为peewe

简单的peewee示例: MySQL DB“Pet”,具有自动递增的“id”和字符字段“name”

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()。其中(pet.name=='Garfield')。限制(1)
cur=database.cursor()
打印(cur.mogrify(*my_pet.sql())
其中,
database
是表示到Postgres的连接的Peewee数据库对象。

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


def peewee_sql_to_str(sql):
返回(sql[0]%元组(sql[1]))
insert\u stmt=Pet.insert(name='Garfield')
sql=insert_stmt.sql()
打印(peewee_sql_to_str(sql))

对不起,这是我的错误。有问题的行是“my_pet=pet.get(name='Garfield')”,注意“.get”。我编辑了问题
。get()
不返回查询对象,而是返回一个模型实例,构造然后丢弃查询。这与
Pet.select().where(Pet.name=='Garfield').limit(1)
大致相同。正如我在GitHub中指出的,这可能只适用于psycopg2。例如,标准库sqlite3模块不支持此API。感谢@coleifer-更新了答案以反映其对pg的特殊性。