请教关于 PYTHON3.6 下使用 MYSQL 数据库的问题 - V2EX
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 6404 次点击
    这是一个创建于 2923 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚开始学习在 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 是另外一个框架,和我问的问题没有直接关系吧?
    GlobalNPC
        3
    GlobalNPC  
       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     Solana     956 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 22:55 PVG 06:55 LAX 15:55 JFK 18:55
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86