数据库导入使用事务的方式,提升效率。

pull/32/head
Apex Liu 2017-06-01 12:39:12 +08:00
parent 11567dd6f4
commit 1920375478
2 changed files with 61 additions and 15 deletions

View File

@ -208,6 +208,14 @@ class TPDatabase:
# log.d('[db] cost {} seconds.\n'.format(_end - _start))
return ret
def transaction(self, sql_list):
# _start = datetime.datetime.utcnow().timestamp()
ret = self._conn_pool.transaction(sql_list)
# _end = datetime.datetime.utcnow().timestamp()
# log.d('[db] transaction\n')
# log.d('[db] cost {} seconds.\n'.format(_end - _start))
return ret
def last_insert_id(self):
return self._conn_pool.last_insert_id()
@ -326,6 +334,12 @@ class TPDatabasePool:
return False
return self._do_exec(_conn, sql)
def transaction(self, sql_list):
_conn = self._get_connect()
if _conn is None:
return False
return self._do_transaction(_conn, sql_list)
def last_insert_id(self):
_conn = self._get_connect()
if _conn is None:
@ -353,6 +367,9 @@ class TPDatabasePool:
def _do_exec(self, conn, sql):
return None
def _do_transaction(self, conn, sql_list):
return False
def _last_insert_id(self, conn):
return -1
@ -379,9 +396,6 @@ class TPSqlitePool(TPDatabasePool):
cursor.execute(sql)
db_ret = cursor.fetchall()
return db_ret
# except sqlite3.OperationalError:
# # log.e('_do_query() error.\n')
# return None
except Exception as e:
log.e('[sqlite] _do_query() failed: {}\n'.format(e.__str__()))
log.e('[sqlite] SQL={}'.format(sql))
@ -389,18 +403,25 @@ class TPSqlitePool(TPDatabasePool):
cursor.close()
def _do_exec(self, conn, sql):
cursor = conn.cursor()
try:
cursor.execute(sql)
conn.commit()
with conn:
conn.execute(sql)
return True
# except sqlite3.OperationalError as e:
except Exception as e:
log.e('[sqlite] _do_exec() failed: {}\n'.format(e.__str__()))
log.e('[sqlite] SQL={}'.format(sql))
return False
finally:
cursor.close()
def _do_transaction(self, conn, sql_list):
try:
# 使用context manager发生异常时会自动rollback正常执行完毕后会自动commit
with conn:
for sql in sql_list:
conn.execute(sql)
return True
except Exception as e:
log.e('[sqlite] _do_transaction() failed: {}\n'.format(e.__str__()))
return False
def _last_insert_id(self, conn):
cursor = conn.cursor()
@ -431,6 +452,7 @@ class TPMysqlPool(TPDatabasePool):
passwd=self._password,
db=self._db_name,
port=self._port,
autocommit=False,
connect_timeout=3.0,
charset='utf8')
except Exception as e:
@ -464,6 +486,24 @@ class TPMysqlPool(TPDatabasePool):
finally:
cursor.close()
def _do_transaction(self, conn, sql_list):
cursor = conn.cursor()
try:
# cursor.execute('BEGIN;')
conn.begin()
for sql in sql_list:
cursor.execute(sql)
# cursor.execute('COMMIT;')
conn.commit()
return True
except Exception as e:
# cursor.execute('ROLLBACK;')
conn.rollback()
log.e('[mysql] _do_transaction() failed: {}\n'.format(e.__str__()))
return False
finally:
cursor.close()
def _last_insert_id(self, conn):
cursor = conn.cursor()
try:

View File

@ -142,13 +142,19 @@ class ImportDatabaseHandler(TPBaseAdminAuthHandler):
# print(line)
sql.append(line)
for line in sql:
db_ret = get_db().exec(line)
db_ret = db.transaction(sql)
if not db_ret:
ret['code'] = -1
ret['message'] = 'SQL语句执行出错: {}'.format(line)
ret['message'] = 'SQL语句执行出错'
return self.write(json.dumps(ret).encode('utf8'))
# for line in sql:
# db_ret = get_db().exec(line)
# if not db_ret:
# ret['code'] = -1
# ret['message'] = 'SQL语句执行出错: {}'.format(line)
# return self.write(json.dumps(ret).encode('utf8'))
ret['code'] = 0
return self.write(json.dumps(ret).encode('utf8'))
except: