【问题标题】:(Python 3.6) TypeError: can't concat bytes to tuple(Python 3.6) TypeError: can't concat bytes to tuple
【发布时间】:2017-07-07 02:24:24
【问题描述】:

我正在尝试将抓取的项目('title')插入到 mySQL 数据库中。

这是我的 spider.py 文件的 sn-p,它会抓取“标题”内容:

#get more details
def parse_detail_page(self, response):
    item = response.meta["item"]

    #title
    title = response.xpath(".//*[@id='titletextonly']/text()").extract()[0]
    item["title"] = title

    return item

这是我的 pipelines.py 文件:

import pymysql.cursors

class mySQLTest(object):

    def __init__(self):
        self.conn = pymysql.connect(host='localhost',
                             user='root',
                             password='',
                             db='testDB',
                             charset='utf8mb4',
                          cursorclass=pymysql.cursors.DictCursor)
        self.cursor = self.conn.cursor()


    def process_item (self, item, spider):
        sql = "INSERT INTO items (title) VALUES (%s)", (item['title'])
        self.cursor.execute(sql)
        self.conn.commit()

        return item

我遇到以下错误:

    Traceback (most recent call last):
  File "/Users/venv1/lib/python3.6/site-packages/twisted/internet/defer.py", line 653, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "/Users/venv1/tutorial/tutorial/pipelines.py", line 31, in process_item
    self.cursor.execute(sql)
  File "/Users/venv1/lib/python3.6/site-packages/pymysql/cursors.py", line 166, in execute
    result = self._query(query)
  File "/Users/sandysu/PyCharmProjects/venv1/lib/python3.6/site-packages/pymysql/cursors.py", line 322, in _query
    conn.query(q)
  File "/Users/venv1/lib/python3.6/site-packages/pymysql/connections.py", line 855, in query
    self._execute_command(COMMAND.COM_QUERY, sql)
  File "/Users/venv1/lib/python3.6/site-packages/pymysql/connections.py", line 1091, in _execute_command
    packet = prelude + sql[:packet_size-1]
TypeError: can't concat bytes to tuple

TypeError: can't concat bytes to tuple 是什么意思?应该如何解决?

【问题讨论】:

  • 如果你改用:sql = "INSERT INTO items (title) VALUES ("+item['title']+")"呢?
  • sql = "INSERT INTO items (title) VALUES ({0})".format(item['title'])怎么样
  • @user3450049 - 您能否说明 {0} 的用途是什么?我尝试了您的建议并收到此错误:pymysql.err.ProgrammingError: (1064,“您的 SQL 语法有错误;请查看与您的 MariaDB 服务器版本相对应的手册,以获取在 'prime location - 附近使用的正确语法 - s/s 电器- h/w 地板 - 可用:7 月 1 日,第 1 行") 作为参考,刮掉的“标题”如下:“AAA 黄金地段 - s/s 电器- h/w 地板 - 可用:7 月第 1 次。
  • @nikpod - 我尝试了您的建议并收到此错误:pymysql.err.ProgrammingError: (1064, "您的 SQL 语法有错误;请查看与您的 MariaDB 服务器版本相对应的手册在第 1 行的“主要位置 - s/s 电器 - 硬件 - 可用:7 月 1 日”附近使用正确的语法)。作为参考,“标题”的内容如下:“AAA 黄金地段 - s/s 电器 - h/w 楼层 - 可用时间:7 月 1 日”

标签: python mysql concat


【解决方案1】:

这是能够最终将数据插入数据库的语法:

def process_item (self, item, spider):
    sql = "INSERT INTO items (title) VALUES (%s)"
    data = item['title']

    self.cursor.execute(sql, data)
    self.conn.commit()

    return item

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多