Python3, CSV, MySQL 蛋疼的问题求解决方案
具体情况是这样的,我需要在Python3里面去load本地的CSV 文件到MySQL中(5.1.63)
直接在shell里面写如下的命令是可以正常实现我要的效果的
load data local infile '/root/2012-08-10.csv' into table market fields terminated by ',' lines terminated by '\n';
然后我想到两个办法但是都存在着一些问题.
1. 用Python去调用shell, 然后再利用shell去控制MySQL的local, 这样理论上应该是可行的.而且我看到过一个前辈写的perl的代码就是这么作的.但我一直在怀疑,这样不知道算不算旁门左道......如果有问题的话,这样写出来的代码应该是很难维护的..
2. 用Python去链接MySQL然后执行load命令.但是这样依然遇到了一些问题首先便是,Python3 for MySQL数据库驱动的问题,我看到很多都是只支持Python2.x的......然后我现在使用的是Mysql官方出的mysql-connector-python-0.3.2-devel在使用了如下语句的时候出错
cmd = "load data local infile '/root/2012-08-10.csv' into table market fields terminated by ',' lines terminated by '\n';"
cursor.execute(cmd)
错误提示:NotSupportedError: 1148: The used command is not allowed with this MySQL version
google了一下这个错误,很多人说低版本的MySQL在编译安装的时候默认是禁止load的,需要在编译的时候打开.但是5.0之后是默认支持的(我的是5.1),另外我在shell里面也能正常使用load所以应该不是这个问题. 会不会是Python3 for MySQL的驱动本身不支持load呢? 我试了下比如show tables;这种却又是支持的...
在最后还有一个问题..Mysql官方出的Python驱动mysql-connector-python已经有1.05bata了使用pip安装
pip install mysql-connector-python
总是会安装到Python2.6里面(我的系统是ubuntu的衍生版自带Python2.6)....pip我不熟悉...能否让其安装到我的Python3里面呢?
或者怎么把安装到Python2.6里面的MySQL驱动移到Python3中呢?
写在最后, 如果是各位前辈, 你们怎么处理Python3控制MySQL的load命令去加载CSV 文件呢?
[解决办法]
一般采用将文件名等作为参数调用 os.system(...)传给 shell,这个是最直接简单,貌似也算是最正宗的吧
[解决办法]
os.system是标准C库实现, fork + exec(/bin/bash -c command)实现的, 是可信赖的.
不过楼主的问题我感觉不是客户端问题, 是Mysql服务端配置问题, 客户端开发库只是query一个sql语句,不会对语句的目的做什么限制,Mysqldb不至于这么不完善吧。
确定编程时使用的用户和命令行客户端使用的一样, 确定是同一个client host。