diadia

興味があることをやってみる。自分のメモを残しておきます。

SQLITE3のINSERT文を動的に作成する。

sqlite3のインサート文は文字列である必要がある。 文字列であるがゆえにダイナミックなインサートは実行しづらいが、 辞書型のデータをもとにインサート文を作成する事ができる。また同一の辞書型データからインサートの値であるタプルを作成できる。
だから動的なものを作るには辞書型のデータを作成すると作れるって覚えておくと便利。

import sqlite3


class JobOffer(object):
    id = None  # int
    company_name = None  # str
    age = None  # str
    category = None  # str
    type = None  # str
    position = None  # str
    license = None  # str
    period = None  # str
    sector = None  # str
    
    def __init__(self, data):
        # dataはプロパティ名とプロパティの値が格納されているものとする
        for key, value in data.items():
            setattr(self, key, value)
        print('attrチェック', self.__dict__)

    def generate_insert_data(self):
        # insertに使うデータはインスタンスのプロパティなのでデータを渡す必要はない
        data = {}
        data['table'] = 'my_table'
        values = {}
        for key, value in self.__dict__.items():
            values[key] = value
        data['values'] = values
        return data

    def create(self, insert_data):
        """ insert 例:cur.execute("INSERT INTO mydb VALUES (?, ?)", (a,b)) """
        table = insert_data['table']
        columns = ', '.join(insert_data["values"].keys())
        hatena = ', '.join(['?' for n in insert_data["values"].values()])
        #print(f"INSERT INTO {table} ({columns}) VALUES ({hatena})" + "\n")
        insert_sql = f"INSERT INTO {table} ({columns}) VALUES ({hatena})"
        data = tuple(insert_data['values'].values())
        # print(data)
        conn = sqlite3.connect('db.sqlite3')
        cursor = conn.cursor()
        try:
            cursor.execute(insert_sql, data)
            conn.commit()
        except sqlite3.IntegrityError as e:
            print('UNIQUE constraint failed')
        cursor.close()
        conn.close()

    def update(self):
        pass

    @staticmethod
    def create_table():
        conn = sqlite3.connect('db.sqlite3')
        cursor = conn.cursor()
        create_table_sql = """CREATE TABLE my_table (
            id integer primary key autoincrement, company TEXT,
            age TEXT, category TEXT, type TEXT,
            position TEXT, license TEXT,
            period TEXT, sector TEXT )"""
        cursor.execute(create_table_sql)