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

我真的有最该死的时间试图找出我收到的错误消息的原因。


我正在编写一个网络抓取工具,它使用 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_database


class 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 pylib

import peewee_lib as pw


class 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 类作为值分配给它们一样简单。有谁知道我在这里出了什么问题?任何帮助将非常感激。


谢谢!


慕丝7291255
浏览 232回答 1
1回答

慕尼黑8549860

分配给属性时,您需要将“temp_query”解析为对象。            if not temp_query.exists():                temp_query = pw.Race(name=row.race)                temp_query.save()            else:                temp_query = temp_query.get()  # fixed.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python