为了账号安全,请及时绑定邮箱和手机立即绑定

尝试使用 Peewee 输入外键字段时出现 AttributeError

尝试使用 Peewee 输入外键字段时出现 AttributeError

慕丝7291255 2021-09-02 16:06:56
我真的有最该死的时间试图找出我收到的错误消息的原因。我正在编写一个网络抓取工具,它使用 Python 和 BeautifulSoup 将数据从Procycing Stats 抓取到 MySQL 数据库中,用于抓取和 Peewee 进行数据库交互。网络爬虫工作得很好,但我在将数据插入 MySQL 表时遇到了一些麻烦。首先,我使用 peewee 的create_tables()函数在空数据库中创建了表。在下面我粘贴了我的 Peewee 模型的代码,它包含在我称为peewee_lib.py.from peewee import *from mysql_login_info import *results_database = MySQLDatabase(mysql_db_name, user=mysql_uname, password=mysql_pw, host='localhost')class BaseModel(Model):    class Meta:        database = results_databaseclass Rider(BaseModel):    pcsid = IntegerField()    name = CharField()class Race(BaseModel):    name = CharField()class Result(BaseModel):    name = CharField()    year = IntegerField()    date = DateField()    position = IntegerField()    points_pcs = IntegerField()    race = ForeignKeyField(Race, backref='results')    rider = ForeignKeyField(Rider, backref='results')接下来,我使用一个文件scrape_to_peewee.py来创建类,这些类将我的抓取库scraper_lib.py和前面提到的 peewee 库中的类定义“绑定”在一起peewee_lib.py。这是来自的代码scrape_to_peewee.py:import scraper_lib as pylibimport peewee_lib as pwclass Sheet_bind:    def __init__(self, rider_obj, sheet):        self.year = sheet.year        self.rider = sheet.rider        self.rows = []        for row in sheet.rows:            if row.row_type == "tour_header":                pass            else:                temp_query = pw.Race.select().where(pw.Race.name == row.race)                if not temp_query.exists():                    temp_query = pw.Race(name=row.race)                    temp_query.save()                else:       将这个最终文件加载到解释器中后,我尝试将示例骑手加载到数据库中。启动Rider_bind课程工作正常,我再次检查以确保一行实际上已写入我rider在 MySQL 中的表中,它有。问题似乎与将 peewee 模型之一分配给外键字段有关。当我颠倒调用顺序以便temp_res.rider = rider_obj先出现时,它给了我同样的错误,回溯指向该调用。从 peewee 文档看来, ForeignKey 字段应该像将另一个 peewee 类作为值分配给它们一样简单。有谁知道我在这里出了什么问题?任何帮助将非常感激。谢谢!
查看完整描述

1 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

分配给属性时,您需要将“temp_query”解析为对象。


            if not temp_query.exists():

                temp_query = pw.Race(name=row.race)

                temp_query.save()

            else:

                temp_query = temp_query.get()  # fixed.


查看完整回答
反对 回复 2021-09-02
  • 1 回答
  • 0 关注
  • 196 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信