dont created columns for fields that are marked as 'joined'
[plcapi.git] / PLC / Storage / AlchemyObject.py
1 from datetime import datetime
2
3 from sqlalchemy.ext.declarative import declarative_base
4 from sqlalchemy import Table, Column, MetaData, join, ForeignKey
5 from sqlalchemy import Column, Integer, String
6 from sqlalchemy import Table, Column, MetaData, join, ForeignKey
7 from sqlalchemy.orm import relationship, backref
8 from sqlalchemy.orm import column_property
9 from sqlalchemy.orm import mapper, object_mapper
10 from sqlalchemy.orm import validates
11 from sqlalchemy import ForeignKey    
12
13 from PLC.Storage.Alchemy import Base, engine, dbsession
14 from PLC.Storage.Record import Record
15 from PLC.Timestamp import Timestamp
16 from PLC.Logger import logger   
17  
18 class AlchemyObj(Record):
19
20     def __init__(self, api=None, fields = {}, object=None):
21         Record.__init__(self, dict=fields, object=object)
22         self.api=api
23
24     def __iter__(self):
25         self._i = iter(object_mapper(self).columns)
26         return self
27
28     def next(self):
29         n = self._i.next().name
30         return n, getattr(self, n)
31
32     def get_table(self):
33         metadata = MetaData(engine)
34         table = Table(self.tablename, metadata)
35         for field in self.fields:
36             param = self.fields[field]
37             # skip params joined from other tables 
38             if param.joined:
39                 continue
40             type = String
41             if param.type == int:
42                 type = Integer
43             elif param.type == datetime:
44                 type = DateTime
45             column = Column(field, type, 
46                             nullable = param.nullok,
47                             indexed = param.indexed,
48                             primary_key=param.primary_key)
49             table.append_column(column)
50         if not table.exists():
51             table.create()
52         return table
53
54     def create(self):
55         table = self.get_table()
56         table.create()    
57
58     def insert(self, values):
59         table = self.get_table()
60         result = dbsession.execute(table.insert().values(values))
61         dbsession.commit()
62         return result
63     
64     def updatedb(self, filter, values):
65         class Cls(object): pass
66         table = self.get_table()
67         clsmapper = mapper(Cls, table)
68         result = dbsession.query(clsmapper).filter_by(**filter).update(values)
69         dbsession.commit()
70         return result
71
72     def delete(self, filter={}):
73         class Cls(object): pass
74         table = self.get_table()
75         clsmapper = mapper(Cls, table)
76         result = dbsession.query(clsmapper).filter_by(**filter).delete()
77         dbsession.commit()         
78         return result
79  
80     def select(self, filter={}):
81         class Cls(object): pass
82         table = self.get_table()
83         clsmapper = mapper(Cls, table) 
84         return dbsession.query(clsmapper).filter_by(**filter)