我正在尝试使用Python脚本将csv文件导入MySQL数据库。 它似乎无声地失败。
这是我的代码:
#!/usr/bin/python
import MySQLdb
class DB:
host = 'localhost'
user = 'root'
password = '**************'
sqldb = 'agriculture'
conn = None
def connect(self):
self.conn = MySQLdb.connect(self.host,self.user,self.password,self.sqldb )
def query(self, sql, params=None):
try:
cursor = self.conn.cursor()
if params is not None:
cursor.execute(sql, params)
else:
cursor.execute(sql)
except (AttributeError, MySQLdb.OperationalError):
self.connect()
cursor = self.conn.cursor()
if params is not None:
cursor.execute(sql, params)
else:
cursor.execute(sql)
print vars(cursor)
return cursor
def load_data_infile(self, f, table, options=""):
sql="""LOAD DATA LOCAL INFILE '%s' INTO TABLE %s FIELDS TERMINATED BY ',';""" % (f,table)
self.query(sql)
db = DB()
pathToFile = "/home/ariggi/722140-93805-sqltest.csv"
table_name = "agriculture.degreedays"
db.load_data_infile(pathToFile, table_name)
在尝试调试这种情况时,我将光标对象转储到“query()”方法中的屏幕上。这是输出:
{'_ result':无,'描述':无,'rownumber':0,'消息':[], '_executed':“LOAD DATA LOCAL INFILE '/home/ariggi/722140-93805-sqltest.csv'INTO TABLE degreedays FIELDS TERMINATED BY',';','errorhandler':>,'rowcount':500L,'connection':,'description_flags':无, 'arraysize':1,'_ info':'记录:500删除:0跳过:0 警告:0','lastrowid':0L,'_last_executed':“LOAD DATA LOCAL INFILE'/home/ariggi/722140-93805-sqltest.csv'INTO TABLE agriculture.degreedays FIELDS终止于',';','_ warnings':0,'_'':()}
如果我采用“_last_executed”查询,即
LOAD DATA LOCAL INFILE '/home/ariggi/722140-93805-sqltest.csv' INTO TABLE agriculture.degreedays FIELDS TERMINATED BY ',';
并通过mysql控制台运行它按预期工作并用行填充表。但是,当我执行此脚本时,我的数据库表仍为空。
我很难过,可以使用一些帮助。
答案 0 :(得分:3)
尝试在代码末尾调用db.conn.commit()
以使更改成为永久更改。默认情况下,Python不使用“自动提交”模式,因此在您发出提交之前,数据库模块会将您的更改视为未完成事务的一部分。
正如@AirThomas在评论中指出的那样,它对我们有一个“情境管理者” - 尽管我说正确的表述是
with conn.cursor() as curs:
do_something_with(curs)
因为除非受控代码引发异常,否则它会自动提交任何更改。