You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python、Peewee、pymysql连接MySQL报错:不存在'returning_clause'

解决Peewee连接MySQL时的"no 'returning_clause'"错误

嘿,作为Python新手遇到这个问题很正常,我来帮你捋清楚问题出在哪,以及怎么解决!

问题根源

你现在的代码直接用MySQLdb.connect()创建了数据库连接,但Peewee作为ORM框架,需要用它自己封装的MySQLDatabase类来管理数据库连接,并且要把这个连接和你的模型绑定起来。直接用原生MySQLdb连接的话,Peewee的ORM机制无法正常工作,就会抛出"no 'returning_clause'"这种内部属性缺失的错误。另外你的date_found字段也没写完,咱们一起补上。

修正后的完整代码

import pymysql
# 把pymysql设为MySQLdb的替代(这一步是对的,保留)
pymysql.install_as_MySQLdb()
from peewee import *

# 用Peewee的MySQLDatabase创建数据库连接
db = MySQLDatabase(
    'xxxxx',  # 你的数据库名
    user='xxxxx',  # 数据库用户名
    password='xxxxx',  # 数据库密码
    host='localhost',
    port=3306,
    charset='utf8mb4'  # 建议加上,避免中文乱码
)

# 定义模型,并且绑定数据库
class SearchUrl(Model):
    id = AutoField()  # AutoField就是自增主键,Peewee可以自动推断,其实这行也可以省略,默认会生成id自增主键
    url = TextField()
    page_title = TextField()
    # 补全date_found字段,比如用DateTimeField记录发现时间,default可以设为当前时间
    date_found = DateTimeField(default=datetime.datetime.now)

    class Meta:
        database = db  # 关键!把模型和数据库绑定
        table_name = 'search_url'  # 可选,指定表名,不指定的话Peewee会自动生成小写的类名复数

# 测试连接并创建表(第一次运行时需要)
if __name__ == '__main__':
    import datetime  # 如果用了datetime.now需要导入
    db.connect()
    # 如果表不存在就创建
    db.create_tables([SearchUrl], safe=True)
    
    # 可以加个测试插入
    new_url = SearchUrl.create(
        url='https://example.com',
        page_title='Example Domain'
    )
    print(f"插入成功,ID: {new_url.id}")
    db.close()

关键要点说明

  • 一定要用MySQLDatabase来创建连接,而不是原生的MySQLdb.connect,这样Peewee才能处理ORM需要的所有内部逻辑(包括你报错的returning_clause)。
  • 模型的Meta类里必须指定database = db,让模型知道该和哪个数据库交互。
  • date_found字段要补全定义,根据你的需求选择DateTimeField或DateField,还可以设置默认值方便使用。
  • 第一次运行时记得调用create_tables来生成对应的数据库表,safe=True会避免表已存在时报错。

这样修改后,你的代码应该就能正常运行啦!

内容的提问来源于stack exchange,提问作者Murray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:13:29