gpt4 book ai didi

Python:MySQLdb LOAD DATA INFILE 静默失败

转载 作者:太空宇宙 更新时间:2023-11-03 12:16:07 25 4
gpt4 key购买 nike

我正在尝试使用 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': None, 'description': None, 'rownumber': 0, 'messages': [], '_executed': "LOAD DATA LOCAL INFILE '/home/ariggi/722140-93805-sqltest.csv' INTO TABLE degreedays FIELDS TERMINATED BY ',';", 'errorhandler': >, 'rowcount': 500L, 'connection': , 'description_flags': None, 'arraysize': 1, '_info': 'Records: 500 Deleted: 0 Skipped: 0 Warnings: 0', 'lastrowid': 0L, '_last_executed': "LOAD DATA LOCAL INFILE '/home/ariggi/722140-93805-sqltest.csv' INTO TABLE agriculture.degreedays FIELDS TERMINATED BY ',';", '_warnings': 0, '_rows': ()}

如果我采用“_last_executed”查询,这是

LOAD DATA LOCAL INFILE '/home/ariggi/722140-93805-sqltest.csv' INTO TABLE agriculture.degreedays FIELDS TERMINATED BY ',';

并通过 mysql 控制台运行它,它按预期工作并用行填充表。然而,当我执行这个脚本时,我的数据库表仍然是空的。

我很困惑,需要一些帮助。

最佳答案

尝试在代码末尾调用 db.conn.commit() 以使更改永久生效。默认情况下,Python 不使用“自动提交”模式,因此在您发出提交之前,数据库模块会将您的更改视为未完成事务的一部分。

正如@AirThomas 在评论中指出的那样,它有助于我们成为“上下文管理器”——尽管我认为正确的表述是

with conn.cursor() as curs:
do_something_with(curs)

因为除非受控代码引发异常,否则这将自动提交任何更改。

关于Python:MySQLdb LOAD DATA INFILE 静默失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22082092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com