我使用pymysql和pandas插入大量数据。
最初,我不指望事务和回滚。
但由于某些原因,我需要处理事务。所以我构建了既可以作为'auto commit,auto close'和'manual commit,manual close'的函数。但当它被用作类似下面代码的insertData函数时,它查询成功,但没有提交,所以db table是空的。在
我希望查询函数的多次调用会导致已执行查询的结果丢失。所以承诺真的什么都不做。在
你能看看这个吗?我使用python3.6,pymysql最新版本,2019年2月7日,MariaDB最新稳定版本。在
下面的代码有一些缺陷,因为我在几分钟内就完成了。
但总体代码流是正确的。我省略了不必要的代码。
如果你需要更多的信息,我会加上的。谢谢:)class DBHandler:
def __init__(host, dbname, ...):
self.host = host
self.db = dbname
# And password, port
def _get_connection():
return pymysql.connect(self.host, self.db...)
def insert(self, query, args, conn=None, commit=True):
try:
if args is not None:
self._set_many(query=query, args=args, conn=conn, commit=commit)
else:
self._set(...) # Used with single query (execute curosr.execut()
except pymysql.Error:
raise Exception('Query failed')
def _set_many(self, query, args, conn, commit):
close = True if conn is None else False
conn = self._get_connection() if conn is None else conn
try:
conn.cursor().executemany(query, args)
except pymysql.Error as err:
if close is True:
conn.close()
raise pymysql.Error(err)
if commit is True: ## Works well when commit=True
conn.commit()
if close is True:
conn.close()
def insertData(db, df):
conn = db._get_connection() # Will return pymysql.connect()
conn.autocommit = False
conn.begin()
item_list = []
query = 'insert into utterance_list (col_1, col_2, col_3) values (col_1=%s, col_2=%s, col_3=%s) where internal_id=%s'
try:
for idx in len(df.index):
item_list.append()
if len(item_list) > 100000:
db.insert(query=query, args=item_list, conn=conn, commit=False)
if len(item_list) != 0:
db.insert(query=query, args=item_list, conn=conn, commit=False)
except Exception as e:
print('Error on qerying')
conn.rollback()
conn.close()
conn.commit()
conn.close()
df = get_df_from_somewhere()
db = DBHandler(host='localhost', dbname='mydb', ...)
try:
insertData(db, df)
except Exception as e:
print(e)
exit(1)
print("Query is complete")
# => Query executed successfully without any exception, but table is empty
# => Output
# Query is complete
此外,工作代码低于哪个更旧
^{pr2}$
更新:似乎“commit()”不起作用。我成功地使用带有服务器连接COMMIT的直接查询插入数据,这意味着事务正在工作,但提交不起作用。但是为什么承诺不起作用呢?在