今回はテーブルにデータを挿入して、選択するところまでやります。
テーブルにデータを挿入するため、SimpleDB クラスに insert 関数を定義します。
引数には table: テーブル名、data: 挿入するデータを辞書型で渡します。
関数内では、引数を基にして “INSERT table INTO (field, field…) VALUES (value, value…)” という SQL 文を組み立てます。
値はプリペアードステートメントで渡すので %s で組み立てておいて self.__cursor.execute(sql, bind) でバインドしています。
INSERT が成功すると、最後の行ID self.__cursor.lastrowid を返し、失敗した場合は、None を返します。
class SimpleDB(object): ... (省略)... def insert(self, table, data): sql = "INSERT INTO %s" % table bind = [] if data is not None and len(data) > 0: # Build fields delim = "" sql += " (" for field, value in data.iteritems(): sql += "%s `%s`" % (delim, field) delim = "," sql += ")" # Build values delim = "" sql += " VALUES (" for field, value in data.iteritems(): sql += "%s " % (delim) sql += "%s" bind.append(value) delim = "," sql += ")" if self.__cursor is not None: self.__cursor.execute(sql, bind) self.__connection.commit() # Return last row ID. return self.__cursor.lastrowid return None ## End def insert ... (省略)... ## End class
次に、このテーブルからデータを取得するため、select 関数を定義します。
引数には table: テーブル名、conditions: 条件を指定する辞書型、sortby: ソートキー、sortdesc: ソート降順(True) を渡します。
関数内では、引数を基にして “SELECT * FROM table WHERE filed = value AND …” という SQL 文を組み立てます。
値はプリペアードステートメントで渡すので %s で組み立てておいて self.__cursor.execute(sql, bind) でバインドしています。
SELECT が成功すると、取得データを辞書型のリストで返し、失敗した場合は、None を返します。
class SimpleDB(object): ... (省略)... def select(self, table, conditions, sortby = None, sortdesc = False): result = None sql = "SELECT * FROM %s" % table bind = [] if conditions is not None and len(conditions) > 0: sql += " WHERE " delim = "" for field, value in conditions.iteritems(): if value is None: sql += "%s `%s` IS NULL" % (delim, field) else: sql += "%s `%s` = " % (delim, field) sql += "%s" bind.append(value) delim = " AND" if sortby is not None: sql += " ORDER BY %s %s" % (sortby, "DESC" if sortdesc else "ASC") if self.__cursor is not None: self.__cursor.execute(sql, bind) columns = self.__cursor.description result = [] for row in self.__cursor.fetchall(): item = {} for (index, value) in enumerate(row): item[columns[index][0]] = value result.append(item) return result ## End def select ... (省略)... ## End class