首页 > 解决方案 > 在以下示例中,在 python 中插入语句到 mysql 中的错误是什么?

问题描述

我正在尝试抓取网站然后从该网站检索数据并使用 python 3 将数据插入到 mysql 中,我想在表中插入的数据是 tuble 并且我实现get_article_details了函数,它正确地生成数据。但是我在插入语句中有一个问题,如下所示:

import pymysql
conn=pymysql.connect(host='localhost',port=3306,user='root',password='')
cur=conn.cursor()
def save_data(data):
    
    cur.execute("insert into shereen.articles values" +str(data))
    conn.commit()
    print(data[0]+"   -->>saved")

def get_article_details(url):
    r=requests.get(url)
    soup=BeautifulSoup(r.text)
    title=soup.title.text
    image=soup.find('div',attrs={"class":"articleimg"}).find('img')['src']
    writer=soup.find('div',attrs={"class":'pinfo'}).find('a').text
    article_date=soup.find('div',attrs={"class":'pinfo'}).find('span').text.replace("|"," ").strip()
    body=soup.find('div',attrs={'id':'NewsStory'})
    body.find('div',attrs={"class":'smsBoxContainer-v1'}).decompose()
    body.find('div',attrs={"class":'min_related'}).decompose()
    body.find('div',attrs={"class":'CoronaContainer inner noPaddding'}).decompose()
    article=[]
    for section in body.findAll('p'):
        article.append(section.text)
    article=''.join(article)
    keywords=soup.find('meta',attrs={'name':'keywords'})['content']
    data=(url,title,image,writer,article_date,article,keywords)
    save_data(data)
    return data

并出现以下错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-125-026157a57db9> in <module>
----> 1 get_article_details("https://www.almasryalyoum.com/news/details/1994354")

<ipython-input-124-42023343dc13> in get_article_details(url)
     16     keywords=soup.find('meta',attrs={'name':'keywords'})['content']
     17     data=(url,title,image,writer,article_date,article,keywords)
---> 18     save_data(data)
     19     return data
     20 

<ipython-input-123-5db81833f7e7> in save_data(data)
      4 def save_data(data):
      5 
----> 6     cur.execute("insert into shereen.articles values" ,str(data))
      7     conn.commit()
      8     print(data[0]+"   -->>saved")

~\anaconda3\lib\site-packages\pymysql\cursors.py in execute(self, query, args)
    166             pass
    167 
--> 168         query = self.mogrify(query, args)
    169 
    170         result = self._query(query)

~\anaconda3\lib\site-packages\pymysql\cursors.py in mogrify(self, query, args)
    145 
    146         if args is not None:
--> 147             query = query % self._escape_args(args, conn)
    148 
    149         return query

TypeError: not all arguments converted during string formatting

标签: pythonmysqlsqlsql-insert

解决方案


值列表应该用括号括起来,并且需要引用字符串(如果有)。

最重要的是,您确实想使用参数:

cur.execute('''insert into shereen.articles 
    (url,title,image,writer,article_date,article,keywords)
    values(?, ?, ?, ?, ?, ?, ?)''', data)

请注意,我(试图)枚举insert语句中的目标列。这是 SQL 中的最佳实践,它使语句更易于调试、更灵活并且以某种方式对目标表的 DML 更改具有弹性。


推荐阅读