peewee 保存数据,提示主键错误。

来源:9-11 通过selenium解析商品详情页 - 5

慕先生6138842

2019-12-26

为什么用 peewee 它会自动建一个ID然后作为主键,但为什么会有报错,说把0输入到主键中去了?无论创建表里我加不加 id = IntegerField(primary_key=True) 这句,都出这个提示
而且设定默认为1开始 ,也不行。图片描述图片描述

写回答

3回答

慕先生6138842

提问者

2019-12-27

from peewee import *

db = MySQLDatabase("python_spider", host="127.0.0.1",port=3306,user="root",password="12345678h")

class BaseModel(Model):
    class Meta:
        database = db

class Good(BaseModel):
    id = IntegerField(primary_key=True, null=True)
    shangpin_id = BigIntegerField(verbose_name="商品id",)
    name = CharField(max_length=500, verbose_name="商品名称",null=True)


class GoodEvaluateSummary(BaseModel):
    good = ForeignKeyField(Good, verbose_name="商品",null=True)
    allcommrnt = IntegerField(default=0, verbose_name="评论总数量",null=True)
    goodcomment = IntegerField(default=0, verbose_name="好评数量",null=True)
    badcomment = IntegerField(default=0, verbose_name="差评数量",null=True)
    commentcontent = CharField(max_length=500, verbose_name="评论内容", null=True)


if __name__ == "__main__":
    pass
0
0

慕先生6138842

提问者

2019-12-27

import json

import requests
from scrapy import Selector


from JD_test import get_item_id as ID
import JD_test.create_Mysql_table as mysql



def parse_good(good_id):
    good_url = "https://item.jd.com/{}.html".format(good_id)
    html = requests.get(good_url).text
    sel = Selector(text=html)
    name ="".join(sel.xpath("/html/head/title/text()").extract()[0]).strip("【行情 报价 价格 评测】-京东")


    price_url = "https://c0.3.cn/stock?skuId={}&area=1_72_2799_0&venderId=1000000904&cat=9987,653,655".format(good_id)
    price_text =requests.get(price_url).text
    price_list = json.loads(price_text)


    headers = {"referer": "https://shouji.jd.com/"}
    productPageComments = requests.get("https://sclub.jd.com/comment/productPageComments.action?productId={}&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1".format(good_id),headers=headers).text
    productPageComments_dict = json.loads(productPageComments)
    max_page = productPageComments_dict["maxPage"]
    Statistics = productPageComments_dict["hotCommentTagStatistics"]

    return [name,price_list,productPageComments_dict]#返回的是一个字典和列表多层嵌套



def iter_x(Gx):
    if isinstance(Gx,dict):
        for key,value in Gx.items():
            yield (key,value)
    elif isinstance(Gx,list):
        for index,value in enumerate(Gx):
            yield(index,value)

def flat(Gx):
    for key, value in iter_x(Gx):
        if isinstance(value, (dict, list)):
            for k, v in flat(value):
                k = f'{key}_{k}'
                yield (k, v)
        else:
            yield (key, value)


def get_allitem_info_dict(pageurl):
    id_list=[]
    for i in ID.get_product_id(pageurl):
        id_list.append(i)
    while id_list:
        roduct_info = parse_good(id_list.pop())
        i_f_dict = {k: v for k, v in flat(roduct_info)}  # 迭代嵌套字典,组成单层字典
        yield i_f_dict


if __name__ == "__main__":
    url = "https://list.jd.com/list.html?cat=9987,653,655&ev=exbrand%5F8557&page=1"
    mysql.db.create_tables([mysql.Good, mysql.GoodEvaluateSummary])
    for i in get_allitem_info_dict(url):
        clear_dict = dict(id=i.get("1_realSkuId"),name=i[0],allcommrnt=i.get("2_productCommentSummary_commentCount"),goodcomment=i.get("2_productCommentSummary_defaultGoodCount"),badcomment=i.get("2_productCommentSummary_poorCount"),commentcontent=i.get("2_comments_0_content"))
        mysql.Good.insert(shangpin_id=clear_dict.get("id"),name=clear_dict.get("name")).execute()
        mysql.Good().save()
        mysql.GoodEvaluateSummary.insert(allcommrnt=clear_dict.get("allcommrnt"),goodcomment=clear_dict.get("goodcomment"),badcomment=clear_dict.get("badcomment"),commentcontent=clear_dict.get("commentcontent")).execute()
        mysql.GoodEvaluateSummary().save()


0
2
慕先生6138842
回复
bobby
好的,273743906 麻烦老师了
2019-12-31
共2条回复

bobby

2019-12-27

你把代码贴一下 我在本地测试一下

0
0

Python爬虫工程师实战 大数据时代必备

慕课网严选精品教程,高质量内容+服务!

2381 学习 · 1158 问题

查看课程