data-manipulation/dm.py

197 lines
7.8 KiB
Python
Raw Normal View History

2017-03-12 15:02:21 +03:00
# -*- coding: utf-8 -*-
import json, os, configparser, shutil
2017-03-15 15:58:26 +03:00
def firstInit():
# Инициализация переменныхб создание конфигруационного файла, копирование шаблонов
global db_type, db_hostname, db_user, db_password, db_name, template_file, db_type
config = configparser.RawConfigParser()
2017-03-20 12:38:14 +03:00
# проверяем тип ОС
if os.name == "nt":
cfg_dir = os.path.join(os.getenv("USERPROFILE"), ".dm")
elif os.name == "posix":
cfg_dir = os.path.join(os.getenv("HOME"), ".dm")
# определим каталог для конфигруции и создадим если его нет
if os.path.isdir(cfg_dir):
print(cfg_dir + " already exists")
else:
os.mkdir(cfg_dir)
cfg_file = os.path.join(cfg_dir, 'dm.cfg')
# создадим файл конфигурации
config.add_section('DataBase')
config.set('DataBase', 'db_type', 'mysql')
config.set('DataBase', 'db_hostname', 'localhost')
config.set('DataBase', 'db_name', 'dm')
config.set('DataBase', 'db_user', 'dm')
config.set('DataBase', 'db_password', 'password')
config.add_section('Directory')
config.set('Directory', 'work_dir', cfg_dir)
config.set('Directory', 'template_dir', os.path.join(cfg_dir, 'db_template'))
# Если конфиг уже есть читаем его если нет, создаем и потом читаем
if os.path.isfile(cfg_file):
config.read(cfg_file)
else:
# Запись конфигурации в файл 'example.cfg'
with open(cfg_file, 'w') as configfile:
config.write(configfile)
configfile.close()
config.read(cfg_file)
work_dir = config.get('Directory', 'work_dir')
template_dir = config.get('Directory', 'template_dir')
db_type = config.get('DataBase', 'db_type')
db_hostname = config.get('DataBase', 'db_hostname')
if db_type == 'sqlite':
db_name = os.path.join(work_dir, config.get('DataBase', 'db_name'))
else:
db_name = config.get('DataBase', 'db_name')
2017-03-20 12:38:14 +03:00
db_user = config.get('DataBase', 'db_user')
db_password = config.get('DataBase', 'db_password')
# Создаём нужные каталоги
if os.path.isdir(work_dir):
print(work_dir + " already exists")
else:
os.mkdir(work_dir)
if os.path.isdir(template_dir):
print(template_dir + " already exists")
else:
os.mkdir(template_dir)
# копируем и читаем файл шаблон БД
template_file = os.path.join(template_dir, 'tables.json')
if os.path.isfile(template_file):
print("Template file already exists")
else:
shutil.copy('tables.json', template_file)
def dbConnect():
global c, db_type, db_hostname, db_user, db_password, db_name
if db_type == "mysql":
import pymysql
conn = pymysql.connect(
db=db_name,
user=db_user,
passwd=db_password,
host=db_hostname,
charset='utf8')
elif db_type == "sqlite":
import sqlite3
conn = sqlite3.connect(db_name)
else:
print(db_type + " database type does`t support")
exit()
#print(conn)
c = conn.cursor()
return c
2017-03-15 15:58:26 +03:00
2017-03-13 16:50:33 +03:00
def createTables(tbl_list):
global tbl_descr_list, tbl_struct_list, c
2017-03-13 16:50:33 +03:00
i = 0
tbl_names_list = []
2017-03-14 17:01:30 +03:00
tbl_descr_list = []
2017-03-15 15:58:26 +03:00
tbl_struct_list = []
2017-03-14 17:01:30 +03:00
2017-03-13 16:50:33 +03:00
while i < len(tbl_list):
2017-03-14 17:01:30 +03:00
one_Table_descr = []
2017-03-15 15:58:26 +03:00
one_Table_struct = []
2017-03-15 17:06:24 +03:00
one_Table_relation = []
2017-03-13 16:50:33 +03:00
tbl_descr = tbl_list[i]["tableDescription"]
tbl_name = tbl_list[i]["tableName"]
#field_list = tbl_list[i]["fieldList"][i].keys()
2017-03-14 17:01:30 +03:00
tbl_names_list.append([tbl_name, tbl_descr])
one_Table_descr.append(tbl_name)
2017-03-15 15:58:26 +03:00
one_Table_struct.append(tbl_name)
2017-03-13 16:50:33 +03:00
x = 0
# список всех полей таблицы
qwery_create = "CREATE TABLE IF NOT EXISTS " + tbl_name + " ("
2017-03-13 16:50:33 +03:00
index = ""
2017-03-14 17:01:30 +03:00
field_names_list = []
2017-03-15 15:58:26 +03:00
struct_fields_list = []
2017-03-13 16:50:33 +03:00
while x < len(tbl_list[i]["fieldList"]):
if tbl_list[i]["fieldList"][x]["autoIncrement"] == "yes":
auto_increment = " AUTO_INCREMENT, "
else:
auto_increment = ", "
qwery_create = qwery_create + tbl_list[i]["fieldList"][x]["fName"] + " " + \
tbl_list[i]["fieldList"][x]["fType"] + auto_increment
if tbl_list[i]["fieldList"][x]["index"] == "PRIMARY KEY":
index = "PRIMARY KEY(" + tbl_list[i]["fieldList"][x]["fName"] + ")"
2017-03-14 17:01:30 +03:00
field_names_list.append(tbl_list[i]["fieldList"][x]["fDescription"])
2017-03-15 15:58:26 +03:00
struct_fields_list.append(tbl_list[i]["fieldList"][x]["fName"])
2017-03-15 17:06:24 +03:00
if tbl_list[i]["fieldList"][x]["relation"]:
relation_list=[tbl_list[i]["fieldList"][x]["fName"]]
relation_list.append(tbl_list[i]["fieldList"][x]["relation"])
one_Table_relation.append(relation_list)
2017-03-13 16:50:33 +03:00
x = x + 1
2017-03-15 17:06:24 +03:00
2017-03-13 16:50:33 +03:00
qwery_create = qwery_create + index + ");"
2017-03-15 15:58:26 +03:00
one_Table_struct.append(struct_fields_list)
2017-03-15 17:06:24 +03:00
one_Table_struct.append(one_Table_relation)
2017-03-14 17:01:30 +03:00
one_Table_descr.append(field_names_list)
2017-03-13 16:50:33 +03:00
i = i + 1
2017-03-14 17:01:30 +03:00
tbl_descr_list.append(one_Table_descr)
2017-03-15 15:58:26 +03:00
tbl_struct_list.append(one_Table_struct)
2017-03-21 16:47:18 +03:00
#print(qwery_create)
#c.execute(qwery_create)
2017-03-13 16:50:33 +03:00
return tbl_names_list
def initDBstructure():
global tbl_descr_list, template_file
table_list = open(template_file, "r", encoding="utf-8")
2017-03-13 16:50:33 +03:00
data = json.load(table_list, encoding="utf-8")
tbl_list = data["tables"]
tbl_names_list = createTables(tbl_list)
2017-03-14 17:01:30 +03:00
2017-03-13 16:50:33 +03:00
return tbl_names_list
2017-03-15 15:58:26 +03:00
# выборка данных из заданной таблицы
def selectData(tbl):
global tbl_struct_list, c, db_type
# если юольше 1 поля добавить CONCAT
2017-03-15 15:58:26 +03:00
qwery = "SELECT "
subqwery = ""
for item in tbl_struct_list:
2017-03-15 15:58:26 +03:00
if item[0] == tbl:
for field in item[1]:
qwery = qwery + field + ","
2017-03-15 17:06:24 +03:00
for rel in item[2]:
field = rel[0]
field_rel = rel[1][0]
field_replace = rel[1][1]
#field_replace = field_replace.replace(",", ",' ',")
#field_replace = field_replace.replace(",", " || ")
# определяем название таблицы для вложенного запроса
table1 = field_rel.split('.')[0]
field1 = field_rel.split('.')[1]
if table1 == tbl:
table1 = table1 + "_1"
subqwery = tbl + " AS " +table1
else:
subqwery = table1
# составляем подзапрос и подменяем им поле в запросе
if db_type == "mysql":
field_replace = field_replace.replace(",", ",' ',")
subqwery = "(SELECT CONCAT(" + field_replace + ") FROM " + subqwery + " WHERE " + table1 + "." + field1 + "=" + tbl + "." + field + ") AS " + field
elif db_type == "sqlite":
field_replace = field_replace.replace(",", " || ' ' ||")
subqwery = "(SELECT (" + field_replace + ") FROM " + subqwery +" WHERE "+ table1 + "." + field1 +"="+ tbl +"."+ field +") AS " + field
qwery = qwery.replace(field, subqwery)
2017-03-15 17:06:24 +03:00
qwery = qwery.rstrip(',') + " FROM " + tbl + " LIMIT 10000"
2017-03-21 16:47:18 +03:00
#print(qwery)
c.execute(qwery)
return c.fetchall()
2017-03-13 16:50:33 +03:00
2017-03-14 17:01:30 +03:00
# получаем на вход имя таблицы и возвращаем список заголовков полей
2017-03-21 20:10:38 +03:00
def getTableStructure(tbl):
2017-03-14 17:01:30 +03:00
global tbl_descr_list
for item in tbl_descr_list:
if item[0] == tbl:
return item[1]
#initDBstructure()
firstInit()
dbConnect()