python で database クラスを作ってみる (Part 3)

今回はテーブルにデータを挿入して、選択するところまでやります。

テーブルにデータを挿入するため、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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください