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)