#!/usr/bin/env python # coding: utf-8 from __future__ import division, unicode_literals import yaml import decimal import sys from sqlalchemy.orm import sessionmaker from AccessDataBase import BaseEngine from sqlalchemy import create_engine from sqlalchemy.orm.collections import InstrumentedList engine = create_engine(BaseEngine.engine, convert_unicode=True) Session = sessionmaker(engine) session = Session() def get_model(name): obj = getattr(BaseEngine, name) if type(BaseEngine.Base) == type(obj) and (not (obj is BaseEngine.Base)): res = session.query(obj).all() if len(res) > 0: return obj def get_model_list(): res = [] for key in BaseEngine.__dict__.keys(): tmp = get_model(key) if tmp: res.append(tmp) return res def dump_yaml(model): """ Обджекты одного типа """ to_dump = [] res = session.query(model).all() name = model.__tablename__ for instance in res: data = instance.__dict__.copy() del data['_sa_instance_state'] for k, v in data.items(): if isinstance(data[k], decimal.Decimal): data[k] = float(v) fk_list = getattr(instance, k[:-3], None) if fk_list and isinstance(fk_list, InstrumentedList): data[k[:-3] + '_fk'] = {'name': k, 'ids': [x.id for x in fk_list]} to_dump.append(data) with open("Fixtures/" + name + ".yml", "w") as outfile: outfile.write(yaml.safe_dump(to_dump, default_flow_style=False, allow_unicode=True )) print name + " dumped" def load_yaml(model): name = model.__tablename__ name = "Fixtures/" + name + ".yml" try: for data in yaml.load(open(name, "r")): if data.get('id'): res = session.query(model).get(data['id']) del data['id'] if res: for k, v in data.items(): #print isinstance(v, list) if k[-3:] == '_fk' : import ipdb; ipdb.set_trace() setattr(res, k, v) session.add(res) session.commit() continue # я забыл что я делаю тут ниже _id = {} for k, v in data.items(): if k[-3:] == '_id' or k == 'active': # donot dave pk _id[k] = data[k] del data[k] m = model(**data) for k, v in _id.items(): setattr(m, k, v) session.add(m) session.commit() print 'Loaded:', name except IOError: print 'No such file', name if len(sys.argv) < 2: print 'try -list' sys.exit() action, args = sys.argv[1], sys.argv[2:] if action == '-list': print "You can dump in files this models:" print [x.__tablename__ for x in get_model_list()] elif action == '-dump': if len(args) > 1: for model_name in args: dump_yaml(get_model(model_name)) else: print '-' * 5 + 'Start' + '-' * 5 [dump_yaml(x) for x in get_model_list()] print '-' * 5 + 'Finish' + '-' * 5 elif action == '-load': if len(args) > 1: for model_name in args: dump_yaml(get_model(model_name)) else: print '-' * 5 + 'Start' + '-' * 5 for key in BaseEngine.__dict__.keys(): obj = getattr(BaseEngine, key) if type(BaseEngine.Base) == type(obj) and (not (obj is BaseEngine.Base)): load_yaml(obj) print '-' * 5 + 'Finish' + '-' * 5 else: print """-list for show all tables -dump for save data in yaml files -load for load from yaml files"""