V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
cokilee
V2EX  ›  Python

Python3 操作 MySQL,数据更新问题。

  •  
  •   cokilee ·
    musitlee · 2017-04-01 21:23:39 +08:00 · 3924 次点击
    这是一个创建于 2573 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近尝试用 Python3 写一个简单的爬虫程序,后端使用 MySQL 存储爬取的一些数据,其中定义了一张 URLs 表,表结构很简单,如下:
    | id | url | flag |
    |----|----|-----|
    程序逻辑是先抓取一定量的 URL 存到 URLs 表中,然后每次取一条 URL 进行处理,处理完之后就更新 URLs 表中对应的记录。其中 flag 列就是用来标识该 URL 是否已经经过处理,列的值用 YES/NO 表示。 相关代码如下:

    def crawler_controller(entry):  
      # 连接数据库
      connection = mysql.connector.connect(user='mysql', password='mysql', database='crawler_db')  
      # 创建游标
      cursor = connection.cursor()  
      # 无限循环,直到从数据库取出的记录为空
      while True:  
        # 从数据库取出一条 flag 标记为 NO 的记录
        sql_select_recored = "SELECT * FROM urls WHERE flag='NO' LIMIT 1"  
        cursor.execute(sql_select_recored)  
        get_values = cursor.fetchall()  
        
        # 判断该记录是否存在数据
        if get_values:  
          # 处理相应的 url
          url_parser(get_values)  
          # 更新已处理的记录,反复测试过,就是这一条出了问题,始终不能更新数据库记录  
          cursor.execute("UPDATE urls SET flag='YES' WHERE id='%s'", get_values[0][0])  
          # 完成处理
          connection.commit()
          cursor.close()
        else  
          break
      # 关闭数据库连接
      connection.close()  
    

    现在的问题是,调用 url_parser(get_values)函数处理完 URL 之后,接下来的更新数据库记录死活不能生效,按道理说 get_values[0][0]的值就是对应的记录 id ,而且直接在数据库的 CLI 下面,用

    UPDATE urls SET flag='YES' WHERE id='1'  
    

    测试,这样又是可以更新记录的。
    还望有经验的老司机们指点一二。

    5 条回复    2017-04-02 10:53:24 +08:00
    izoabr
        1
    izoabr  
       2017-04-01 21:39:53 +08:00
    事务锁吧,干脆用消息队列好了。
    zeraba
        2
    zeraba  
       2017-04-01 21:41:42 +08:00 via Android
    print get_values[0][0] 下看看就知道了
    理论上应该是空?
    get_values[0] 试试 print 这个能否输出数据库的 id 字段
    fuxkcsdn
        3
    fuxkcsdn  
       2017-04-01 23:00:12 +08:00
    +1 ,打印 get_values[0][0] 看看顺序是否你预期的

    btw, 既然都 limit 1 了,干嘛还用 fetchall ,直接用 fetchone 不就得了
    izoabr
        4
    izoabr  
       2017-04-01 23:34:37 +08:00
    是不是可以 dict cursor
    wdeil
        5
    wdeil  
       2017-04-02 10:53:24 +08:00 via Android
    建议 select 语句取出所需的列而不是用*,这样可以预计所需 id 的 key 。不过这样的处理还是推荐多线程然后使用队列来操作 MySQL 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5371 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 07:57 · PVG 15:57 · LAX 00:57 · JFK 03:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.