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
saximi
V2EX  ›  Python

请教关于 PYTHON3.6 下使用 MYSQL 数据库的问题

  •  
  •   saximi · 2017-10-16 21:51:43 +08:00 · 6097 次点击
    这是一个创建于 2629 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚开始学习在 WIN7+PYTHON3.6+MYSQL 数据库的环境下编写爬虫,研究了网上的一个用 MySQLdb 模块和 MYSQL 的例子: http://www.cnblogs.com/rwxwsblog/p/4572367.html 
    
    将文中代码在 WIN7+PYTHON3.6 环境下运行时却遇到了问题: 
    
    1、执行 import MySQLdb 时报模块不存在的错,在 pypi 网站上的 MySQL-python 提示只适用于 PYTHON2.7,那么应该安装什么包呢? 
    
    2、在网上看到这句话:“ MySQLdb,目前看来,可以视为一个不再继续维护的项目了。另外,针对 python 3.x 的 mysql,另外一个项目,pymysql 导致可以考虑。其是兼容 dbapi 的” 所以,是否 MySQLdb 包在 WIN7+PYTHON3.6 的环境下应该改为用 pymysql 更合适?  
    
    3、若改用 pymysql,dbpool=adbapi.ConnectionPool('MySQLdb',**dbargs) 这个语句在 PYTHON3.6 下要实现相同功能对应的写法应该是什么? 
     
    4、若改用 pymysql,cursorclass=MySQLdb.cursors.DictCursor, 这个语句对应的 PYTHON3.6 下的写法应该是什么?  
    
    5、如果还是用 MySQLdb 模块,游标如何声明? 我发现下面这两条语句的写法是错误的,提示 dbpool 没有 cursor 属性。 
       dbpool=adbapi.ConnectionPool('MySQLdb',**dbargs) 
       cur=dbpool.cursor()  #报错,提示 dbpool 没有 cursor 属性 
    
    

    恳请大家指点,万分感谢!

    26 条回复    2017-10-18 19:30:11 +08:00
    takanasi
        1
    takanasi  
       2017-10-16 21:57:01 +08:00
    SQLAlchemy
    saximi
        2
    saximi  
    OP
       2017-10-16 22:23:44 +08:00
    @takanasi 谢谢,但是 SQLAlchemy 是另外一个框架,和我问的问题没有直接关系吧?
    infun
        3
    infun  
       2017-10-16 22:25:44 +08:00
    pymysql
    herozem
        4
    herozem  
       2017-10-16 22:43:13 +08:00
    PyMySQL
    sunwei0325
        5
    sunwei0325  
       2017-10-16 22:47:12 +08:00
    adbapi 是 twisted 包的异步 api
    cxyfreedom
        6
    cxyfreedom  
       2017-10-16 22:51:51 +08:00
    用 PyMySQL 啊,写法基本没变
    saximi
        7
    saximi  
    OP
       2017-10-16 23:00:31 +08:00
    @infun
    @herozem
    @cxyfreedom 我试过 PYMYSQL,但是有些问题:

    dbpool=adbapi.ConnectionPool('MySQLdb',**dbargs) 这个语句中的'MySQLdb'要改成什么?
    cursorclass=MySQLdb.cursors.DictCursor 这个语句中的 MySQLdb 又要改成什么?
    saximi
        8
    saximi  
    OP
       2017-10-16 23:01:42 +08:00
    @sunwei0325 请问哪里有关于 adbapi 的详细说明呢,至少是关于 ConnectionPool()方法的说明也行。
    另外,用这个 api 的话,事务是自动提交的吧,多少条记录提交一次?在哪里可以设置每次提交多少条记录呢?
    ksupertu
        9
    ksupertu  
       2017-10-16 23:06:53 +08:00 via iPhone
    缺 mysql 的客户端库
    billlee
        10
    billlee  
       2017-10-16 23:10:16 +08:00
    saximi
        11
    saximi  
    OP
       2017-10-16 23:27:44 +08:00
    @billlee
    @ksupertu 谢谢,请问装了这个客户端库后,是用 pymysql 模块而不是 MySQLdb 对吧?
    billlee
        12
    billlee  
       2017-10-16 23:28:52 +08:00
    @saximi #11 如果用 mysqlclient, 还是 import MySQLdb.
    cxyfreedom
        13
    cxyfreedom  
       2017-10-16 23:39:55 +08:00
    In [1]: import pymysql

    In [2]: from twisted.enterprise import adbapi

    In [3]: config = {
    ...: "host": "127.0.0.1",
    ...: "db": "mysql",
    ...: "user": "root",
    ...: "passwd": "",
    ...: "cursorclass": pymysql.cursors.DictCursor,
    ...: }

    In [4]: pymysql.install_as_MySQLdb()

    In [5]: dbpool = adbapi.ConnectionPool('MySQLdb', **config)

    @saximi
    lxy
        14
    lxy  
       2017-10-16 23:48:37 +08:00
    多看文档,dbmodule 只要符合 PEP 249 也就是 DB-API 2.0 都支持。
    http://twistedmatrix.com/documents/current/core/howto/rdbms.html
    cursorclass 示例里就有。
    https://github.com/PyMySQL/PyMySQL
    saximi
        15
    saximi  
    OP
       2017-10-16 23:50:44 +08:00
    @cxyfreedom 非常感谢! 那么游标怎么声明,这么写不对吧 cur=dbpool.cursor()
    saximi
        16
    saximi  
    OP
       2017-10-16 23:54:12 +08:00
    @lxy 非常感谢,我先去看看
    cxyfreedom
        17
    cxyfreedom  
       2017-10-16 23:55:23 +08:00
    @saximi 没有直接游标,用 runInteraction 这一类构造函数来传递参数里面,效果等同。具体的你要去看文档
    saximi
        18
    saximi  
    OP
       2017-10-17 00:05:49 +08:00
    @cxyfreedom 哪里有比较好的关于这个的在线或离线教程呢?谢谢
    cxyfreedom
        19
    cxyfreedom  
       2017-10-17 00:30:11 +08:00
    @saximi
    临时写的例子
    http://7xrk4u.com1.z0.glb.clouddn.com/demo.png

    教程的话各种 blog 应该能够看懂吧
    janxin
        20
    janxin  
       2017-10-17 08:48:57 +08:00 via iPhone
    用 mysqlclient,这是 python3 port 的 MySQLdb
    pyufftj
        21
    pyufftj  
       2017-10-17 11:38:09 +08:00
    pymysql 平时都用这个
    julyclyde
        22
    julyclyde  
       2017-10-17 13:31:27 +08:00
    install_as_MySQLdb()
    然后其它都照旧
    crazykuma
        23
    crazykuma  
       2017-10-17 14:16:00 +08:00
    用 pymysql,然后用 SQLAlchemy 建立连接池,方便快捷
    saximi
        24
    saximi  
    OP
       2017-10-17 20:07:17 +08:00
    @cxyfreedom 非常感谢! 我自己尝试着用 runQuery()方法来实现,例如下面的语句:
    r=self.dbpool.runQuery("SELECT count(*) FROM tab")

    因为返回的结果是元组,所以我接着用这个语句输出查询结果:
    print(r[0][0])

    但是报错 TypeError: 'Deferred' object does not support indexing
    如果直接打印 r, 得到的只是对象的地址,我应该如何写才能正确输出用 runQuery 得到的查询结果呢?
    cxyfreedom
        25
    cxyfreedom  
       2017-10-18 10:04:31 +08:00
    @saximi 你仔细看我后面那个例子是怎么调用的啊。还有就是看文档,看博客。
    saximi
        26
    saximi  
    OP
       2017-10-18 19:30:11 +08:00
    @cxyfreedom 我发现_getData()返回的竟然不是 SQL 语句执行后的结果,而是 True 和 False?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2589 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 04:58 · PVG 12:58 · LAX 20:58 · JFK 23:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.