我正在尝试使用有趣/有趣的示例来学习MySQL和Python。我是两个新手,因为我是一个交易财务人员。我一路上学到了很多东西,但我不知道该去哪里。
我想要导入的数据文件包含在一个zip文件中,托管:here
我解压缩了目录,是否有超过1000个文件。在下面的代码中,我只是尝试单独引用其中一个文件以将其解析为MySQL。
我完全清楚必须有一个更简单的方法来解决这个问题,但我正在学习,我确信我的代码会反映出来(你可以看到我输入了一些基本的打印件,看到我的代码是正确的)。
您可以提供任何帮助,我们将非常感激。从本质上讲,当涉及到Python时,我认为它是一种业余爱好,也是一种获取我想要使用的网络上大量数据的方法。我粘贴了下面的代码,以便您可以看到我来自哪里。
P.S。对于下面的代码感到抱歉,无法找到更好的发布方式。
以下代码是我的创建表脚本
> DROP TABLE IF EXISTS `nba`.`event`;
CREATE TABLE `nba`.`event` (
`a1` varchar(45) DEFAULT NULL,
`a2` varchar(45) DEFAULT NULL,
`a3` varchar(45) DEFAULT NULL,
`a4` varchar(45) DEFAULT NULL,
`a5` varchar(45) DEFAULT NULL,
`h1` varchar(45) DEFAULT NULL,
`h2` varchar(45) DEFAULT NULL,
`h3` varchar(45) DEFAULT NULL,
`h4` varchar(45) DEFAULT NULL,
`h5` varchar(45) DEFAULT NULL,
`period` int(11) DEFAULT NULL,
`time` time DEFAULT NULL,
`team` varchar(3) DEFAULT NULL,
`etype` varchar(15) DEFAULT NULL,
`assist` varchar(45) DEFAULT NULL,
`away` varchar(45) DEFAULT NULL,
`block` varchar(45) DEFAULT NULL,
`entered` varchar(45) DEFAULT NULL,
`home` varchar(45) DEFAULT NULL,
`left` varchar(45) DEFAULT NULL,
`num` int(11) DEFAULT NULL,
`opponent` varchar(45) DEFAULT NULL,
`outof` varchar(45) DEFAULT NULL,
`player` varchar(45) DEFAULT NULL,
`points` int(11) DEFAULT NULL,
`possession` varchar(45) DEFAULT NULL,
`reason` varchar(50) DEFAULT NULL,
`result` varchar(10) DEFAULT NULL,
`steal` varchar(45) DEFAULT NULL,
`type` varchar(30) DEFAULT NULL,
`x` varchar(2) DEFAULT NULL,
`y` varchar(2) DEFAULT NULL,
`gameid` varchar(15) NOT NULL,
`seqnum` int(11) NOT NULL AUTO_INCREMENT,
`updated` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`seqnum`,`gameid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Datafiles of play by play from basketballgeek.com';
这是我的python脚本。我把上面的表放在一个名为NBA的模式中。我设置了我的表,以便我相信,为每个输入数据库的记录创建一个序列号。我将gameid作为字符串传递给它,并假设将为每个insert语句创建时间戳。我知道有一个错误,但我无法弄清楚它是什么。
sql = """LOAD DATA INFILE '%s' INTO TABLE event FIELDS TERMINATED BY ',' LINES TERMINATED BY '\\n';""" % path print sql try: cursor.execute(sql) db.commit() except: print "ERROR" db.rollback() db.close()
答案 0 :(得分:5)
为什么不使用MySQL自己的CSV导入功能?
http://dev.mysql.com/doc/refman/5.0/en/load-data.html
LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
答案 1 :(得分:1)
您需要输出实际错误,如下所示:
try:
cursor.execute(sql)
db.commit()
except StandardError, e:
print e
db.rollback()
例如,当我执行上述操作时,我得到以下输出
(29, "File '/opt/mysql/data/51/test/data.csv' not found (Errcode: 2)")
请注意,您要为LOAD DATA指定LOCAL关键字。没有它,它会假设文件位于运行MySQL服务器的机器上,这可能与运行脚本的机器不同?
答案 2 :(得分:0)
我猜你的错误类似于我的错误。
尝试
LOAD DATA LOCAL INFILE 'data.txt' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
而不是
LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
此语法用于确保相对于客户端而不是服务器读取数据。