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
00 -
慕先生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()
022019-12-31 -
bobby
2019-12-27
你把代码贴一下 我在本地测试一下
00
相似问题