OSDN Git Service

3f0124027b0bfdf4188c7bdbcc7fab9c9411a61e
[amulettoolsmh4/main.git] / model / db_generator_old.py
1 # -*- coding: utf-8 -*-
2
3 # databaseの生成用スクリプト
4
5 import sqlite3
6 import csv
7 import os.path
8 import os, sys
9
10 DataDirecroty = "data"
11 OutputDBFileName = "OmamoriMH4.sqlite3"
12 MinMaxFileName = "minmax.csv"
13 SecondSkillFileName = "2ndskill.csv"
14 SecondSlotFileName = "slot_2ndskill.csv"
15
16 class DataBaseGenerator(object):
17     u""" this is access class to database """
18
19     # for minmax
20     MinMaxMasterTableName = u"skill_minmax_master"
21     MinMaxTableName = u"skill_minmax_{id}"
22     MinMaxMasterCreateSql = u"create table if not exists skill_minmax_master(id integer primary key, omamori_name varchar, skill_table_name varchar);"
23     MinMaxCreateSql = u"create table if not exists {table_name}(id integer primary key, skill_name varchar, min1 integer, max1 integer, min2 integer, max2 integer);"
24     
25     # for Second skill
26     SecondTableName = u"skill_second_{id}"
27     SecondSlotTableName = u"skill_second_slot"
28     SecondMasterTableName = u"skill_second_master"
29     SecondMasterCreateSql = u"create table if not exists skill_Second_master(id integer primary key, omamori_name varchar, Second_table_name varchar);"
30     SecondCreateSql = u"create table if not exists {table_name}(id integer primary key, random_seed integer unique, skill_name1 varchar, skill_name2 varchar, skill_name3 varchar, skill_name4 varchar, skill_name5 varchar, skill_name6 varchar, skill_name7 varchar);"
31     SecondSlotCreateSql = u"create table if not exists {table}(id integer primary key, random_seed integer unique, slot1 integer, slot2 integer, slot3 integer, slot4 integer, slot5 integer, slot6 integer, slot7 integer);".format(table=SecondSlotTableName)
32
33     def __init__(self, dbName=None):
34         if dbName is None:
35             self._dbName = ":memory:"
36         else :
37             self._dbName = dbName
38
39     def Open(self):
40         self._connect = sqlite3.connect(self._dbName)
41         self._connect.text_factory = str   # for usage of utf-8
42         self._cursor = self._connect.cursor()
43
44     def CreateSecondSkillTable(self):
45         u"""
46         csvファイルから第2スキルの表を生成する
47         """
48         print "load Second skill"
49         self._cursor.execute(self.SecondMasterCreateSql)    # create master table of Second skill
50         reader = csv.reader(file(os.path.join(DataDirecroty, SecondSkillFileName), "r"))  # (omamori_name, filename of Second_skill)
51
52         reader.next()   # skip header row
53         cnt = 0
54         for row in reader:
55             tableName = self.SecondTableName.format(id=cnt)
56             createSql = self.SecondCreateSql.format(table_name=tableName)
57             insertSql = u"insert into {table}(omamori_name, Second_table_name) values(?, ?);".format(table=self.SecondMasterTableName)
58             oma_name = row[0].strip()
59             self._cursor.execute(insertSql, (oma_name, tableName))
60             self._cursor.execute(createSql) # create skill table for each omamori
61
62             reader1 = None
63             fname1 = os.path.join(DataDirecroty, row[1].strip())
64             if os.path.exists(fname1) and os.path.isfile(fname1):
65                 reader1 = csv.reader(file(fname1, "r"))  # (random seed, skill1, skil2, ..., skill7)
66             else:
67                 print "file1 ", fname1, " doesn't exist!"
68
69             insertSql = u"insert into {table}(random_seed, skill_name1, skill_name2, skill_name3, skill_name4, skill_name5, skill_name6, skill_name7) values(?,?,?,?,?,?,?,?);".format(table=tableName)
70
71             if reader1 is not None:
72                 reader1.next()  # skip header
73                 for row1 in reader1:
74                     val_tup = tuple([x.strip() if i != 0 else int(x.strip()) for i, x in enumerate(row1)])
75                     self._cursor.execute(insertSql, val_tup)
76
77             cnt += 1
78
79         # for Slot table
80         self._cursor.execute(self.SecondSlotCreateSql)    # create slot table of Second skill
81         reader = csv.reader(file(os.path.join(DataDirecroty, SecondSlotFileName), "r"))  # (random_seed, slot1, slot2, ..., slot7)
82
83         reader.next()   # skip header row
84         insertSql = u"insert into {table}(random_seed, slot1, slot2, slot3, slot4, slot5, slot6, slot7) values(?,?,?,?,?,?,?,?);".format(table=self.SecondSlotTableName)
85         for row in reader:
86             val_tup = tuple([int(x.strip()) for x in row])
87             self._cursor.execute(insertSql, val_tup)
88
89         self._connect.commit()
90
91     def CreateMinMaxTable(self):
92         u""" 
93         お守り名と対応するスキルの最大最小値の記載されたcsvファイルから
94         お守りごとのスキルの最大最小値を記載したテーブルを作成する
95         """
96         print "load min & max of skill"
97
98         self._cursor.execute(self.MinMaxMasterCreateSql)    # create master table of skill min max
99         reader = csv.reader(file(os.path.join(DataDirecroty, MinMaxFileName), "r"))  # (name, filename of minmax1, filename of minmax2)
100
101         reader.next()   # skip header row
102         cnt = 0
103         for row in reader:
104             tableName = self.MinMaxTableName.format(id=cnt)
105             createSql = self.MinMaxCreateSql.format(table_name=tableName)
106             insertSql = u"insert into {table}(omamori_name, skill_table_name) values(?, ?);".format(table=self.MinMaxMasterTableName)
107             oma_name = row[0].strip()
108             self._cursor.execute(insertSql, (oma_name, tableName))
109             self._cursor.execute(createSql) # create minmax table for each omamori
110
111             reader1, reader2 = None, None
112             fname1, fname2 = os.path.join(DataDirecroty, row[1].strip()), os.path.join(DataDirecroty, row[2].strip())
113             if os.path.exists(fname1) and os.path.isfile(fname1):
114                 reader1 = csv.reader(file(fname1, "r"))  # (name of skill1, min1, max1)
115             else:
116                 print "file1 ", fname1, " doesn't exist!"
117             if os.path.exists(fname2) and os.path.isfile(fname2):
118                 reader2 = csv.reader(file(fname2, "r"))  # (name of skill1, min1, max1)
119             else:
120                 print "file2 ", fname2, " doesn't exist!"
121
122             insertSql = u"insert into {table}(skill_name, min1, max1, min2, max2) values(?,?,?,?,?);".format(table=tableName)
123
124             skill_dict = {} # dict for skill1, skill2
125
126             if reader1 is not None:
127                 reader1.next()  # skip header
128                 for row1 in reader1:
129                     minVal, maxVal = int(row1[1]), int(row1[2])
130                     skill_name = row1[0].strip()
131                     skill_dict[skill_name] = (minVal, maxVal, 0, 0)
132
133             if reader2 is not None:
134                 reader2.next()  # skip header
135                 for row2 in reader2:
136                     minVal, maxVal = int(row2[1]), int(row2[2])
137                     skill_name = row2[0].strip()
138                     if skill_name in skill_dict:
139                         val = skill_dict[row2[0]]
140                         skill_dict[skill_name] = (val[0], val[1], minVal, maxVal)
141                     else:
142                         skill_dict[skill_name] = (0, 0, minVal, maxVal)
143
144             # insert to minmax table
145             for k, v in skill_dict.items():
146                 self._cursor.execute(insertSql, (k,) + v)
147
148             cnt += 1
149
150         self._connect.commit()
151
152     def Close(self):
153         self._connect.commit()
154         self._cursor.close()
155         self._connect.close()
156
157     def DropTables(self):
158         u""" 全てのテーブルの削除 """
159         self._cursor.execute("select name from sqlite_master where type='table';")
160         tableNames = []
161         for catalog in cur.fetchall():
162             tableNames.append(catalog[0])
163         for table in tableNames:
164             self._cursor.execute("drop table {name};".format(name=table))
165         self._connect.commit()
166
167
168 if __name__ == "__main__":
169     db = DataBaseGenerator(OutputDBFileName)
170     #db = DataBaseGenerator()    # for memory
171     db.Open()
172     db.CreateMinMaxTable()
173     db.CreateSecondSkillTable()
174     db.Close()
175