mysql initlized_pymysql事务不能与多个函数一起正常工作

我使用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的直接查询插入数据,这意味着事务正在工作,但提交不起作用。但是为什么承诺不起作用呢?在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值