刚开始学习在 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 属性
恳请大家指点,万分感谢!
![]() | 1 takanasi 2017-10-16 21:57:01 +08:00 SQLAlchemy |
![]() | 3 GlobalNPC 2017-10-16 22:25:44 +08:00 pymysql |
![]() | 4 herozem 2017-10-16 22:43:13 +08:00 PyMySQL |
![]() | 5 sunwei0325 2017-10-16 22:47:12 +08:00 adbapi 是 twisted 包的异步 api |
![]() | 6 cxyfreedom 2017-10-16 22:51:51 +08:00 用 PyMySQL 啊,写法基本没变 |
7 saximi OP @infun @herozem @cxyfreedom 我试过 PYMYSQL,但是有些问题: dbpool=adbapi.ConnectionPool('MySQLdb',**dbargs) 这个语句中的'MySQLdb'要改成什么? cursorclass=MySQLdb.cursors.DictCursor 这个语句中的 MySQLdb 又要改成什么? |
8 saximi OP @sunwei0325 请问哪里有关于 adbapi 的详细说明呢,至少是关于 ConnectionPool()方法的说明也行。 另外,用这个 api 的话,事务是自动提交的吧,多少条记录提交一次?在哪里可以设置每次提交多少条记录呢? |
9 ksupertu 2017-10-16 23:06:53 +08:00 via iPhone 缺 mysql 的客户端库 |
10 billlee 2017-10-16 23:10:16 +08:00 |
11 saximi OP |
![]() | 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 |
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 |
15 saximi OP @cxyfreedom 非常感谢! 那么游标怎么声明,这么写不对吧 cur=dbpool.cursor() |
![]() | 17 cxyfreedom 2017-10-16 23:55:23 +08:00 @saximi 没有直接游标,用 runInteraction 这一类构造函数来传递参数里面,效果等同。具体的你要去看文档 |
18 saximi OP @cxyfreedom 哪里有比较好的关于这个的在线或离线教程呢?谢谢 |
![]() | 19 cxyfreedom 2017-10-17 00:30:11 +08:00 |
![]() | 20 janxin 2017-10-17 08:48:57 +08:00 via iPhone 用 mysqlclient,这是 python3 port 的 MySQLdb |
![]() | 21 pyufftj 2017-10-17 11:38:09 +08:00 pymysql 平时都用这个 |
22 julyclyde 2017-10-17 13:31:27 +08:00 install_as_MySQLdb() 然后其它都照旧 |
23 crazykuma 2017-10-17 14:16:00 +08:00 用 pymysql,然后用 SQLAlchemy 建立连接池,方便快捷 |
24 saximi OP @cxyfreedom 非常感谢! 我自己尝试着用 runQuery()方法来实现,例如下面的语句: r=self.dbpool.runQuery("SELECT count(*) FROM tab") 因为返回的结果是元组,所以我接着用这个语句输出查询结果: print(r[0][0]) 但是报错 TypeError: 'Deferred' object does not support indexing 如果直接打印 r, 得到的只是对象的地址,我应该如何写才能正确输出用 runQuery 得到的查询结果呢? |
![]() | 25 cxyfreedom 2017-10-18 10:04:31 +08:00 @saximi 你仔细看我后面那个例子是怎么调用的啊。还有就是看文档,看博客。 |
26 saximi OP @cxyfreedom 我发现_getData()返回的竟然不是 SQL 语句执行后的结果,而是 True 和 False? |