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
相关产品推荐
相关产品推荐

