From 04fe0182519b966db182c68677b9b55da4943656 Mon Sep 17 00:00:00 2001 From: tobe Date: Wed, 19 Jan 2022 17:49:36 +0800 Subject: [PATCH] Fix the issue to support tuple type when insert with placeholder --- python/openmldb_dbapi/dbapi.py | 65 ++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 23 deletions(-) diff --git a/python/openmldb_dbapi/dbapi.py b/python/openmldb_dbapi/dbapi.py index 9c3bee988da..0688075e913 100644 --- a/python/openmldb_dbapi/dbapi.py +++ b/python/openmldb_dbapi/dbapi.py @@ -138,7 +138,6 @@ def __str__(self): class Cursor(object): def __init__(self, db, zk, zkPath, conn): - self.description = None self.rowcount = -1 self.arraysize = 1 @@ -151,6 +150,7 @@ def __init__(self, db, zk, zkPath, conn): self._resultSetMetadata = None self._resultSetStatus = None self._resultSet = None + self.lastrowid = None def connected(func): def func_wrapper(self, *args, **kwargs): @@ -237,20 +237,33 @@ def execute(self, operation, parameters=()): for i in range(len(holdIdxs)): idx = holdIdxs[i] name = schema.GetColumnName(idx) - if name not in parameters: - return False, "col {} data not given".format(name) - if parameters[name] is None: - if schema.IsColumnNotNull(idx): - raise DatabaseError("column seq {} not allow null".format(idx)) - else: + + # Check parameters type, like tuple or dict + if type(parameters) is tuple: + if isinstance(parameters[i], str): + strSize += len(parameters[i]) + + elif type(parameters) is dict: + if name not in parameters: + raise DatabaseError("col {} data not given".format(name)) + + if parameters[name] is None: + if schema.IsColumnNotNull(idx): + raise DatabaseError("column seq {} not allow null".format(idx)) + else: + continue + colType = schema.GetColumnType(idx) + if colType != sql_router_sdk.kTypeString: continue - colType = schema.GetColumnType(idx) - if colType != sql_router_sdk.kTypeString: - continue - if isinstance(parameters[name], str): - strSize += len(parameters[name]) + if isinstance(parameters[name], str): + strSize += len(parameters[name]) + else: + raise DatabaseError("{} value tpye is not str".format(name)) else: - raise DatabaseError("{} value tpye is not str".format(name)) + # The parameters is neither tuple or dict + raise DatabaseError("Parameters type {} does not support: {}, should be tuple or dict". + format(type(parameters), parameters)) + builder.Init(strSize) appendMap = { sql_router_sdk.kTypeBool: builder.AppendBool, @@ -263,17 +276,26 @@ def execute(self, operation, parameters=()): # TODO: align python and java date process, 1900 problem sql_router_sdk.kTypeDate: lambda x : len(x.split("-")) == 3 and builder.AppendDate(int(x.split("-")[0]), int(x.split("-")[1]), int(x.split("-")[2])), sql_router_sdk.kTypeTimestamp: builder.AppendTimestamp - } + } for i in range(len(holdIdxs)): idx = holdIdxs[i] name = schema.GetColumnName(idx) - if parameters[name] is None: - builder.AppendNULL() - continue colType = schema.GetColumnType(idx) - ok = appendMap[colType](parameters[name]) - if not ok: - raise DatabaseError("erred at append data seq {}".format(i)); + + if type(parameters) is tuple: + ok = appendMap[colType](parameters[i]) + if not ok: + raise DatabaseError("error at append data seq {}".format(i)) + elif type(parameters) is dict: + if parameters[name] is None: + builder.AppendNULL() + continue + ok = appendMap[colType](parameters[name]) + if not ok: + raise DatabaseError("error at append data seq {}".format(i)) + else: + raise DatabaseError("error at append data seq {} for unsupported type".format(i)) + ok, error = self.connection._sdk.executeInsert(self.db, command, builder) else: ok, error = self.connection._sdk.executeInsert(self.db, command) @@ -347,7 +369,6 @@ def setoutputsize(self, size, columns=()): def fetchall(self): raise NotSupportedError("Unsupported in OpenMLDB") - @staticmethod def substitute_in_query(string_query, parameters): query = string_query @@ -398,8 +419,6 @@ def executeRequest(self, sql, parameter): self._pre_process_result(rs) return self - - class Connection(object): def __init__(self, db, zk, zkPath):