Advertisement
AlexVhr

SQLA dynamic hybrid property trouble

Jan 23rd, 2013
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.71 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. from sqlalchemy import create_engine
  4. from sqlalchemy.orm import sessionmaker, relationship
  5. from sqlalchemy.ext.declarative import declarative_base, declared_attr
  6. from sqlalchemy.ext.hybrid import hybrid_property, hybrid_method
  7. from sqlalchemy import Column, Integer, ForeignKey, String
  8.  
  9. sa_engine = create_engine("sqlite:///:memory:")
  10. Session = sessionmaker(bind=sa_engine)
  11. s = Session()
  12.  
  13. class Base(object):
  14.     @declared_attr
  15.     def __tablename__(cls):
  16.         return cls.__name__.lower()
  17.     id = Column(Integer, primary_key=True)
  18.  
  19. Base = declarative_base(cls=Base)
  20.  
  21. class Order(Base):
  22.     number = Column(String(5))
  23.  
  24. class Invoice(Base):
  25.     number = Column(String(5))
  26.  
  27. class Payable(Base):
  28.  
  29.     type = Column(String(50))
  30.  
  31.     order_id = Column(Integer, ForeignKey('order.id'))
  32.     order = relationship(Order)
  33.  
  34.     invoice_id = Column(Integer, ForeignKey('invoice.id'))
  35.     invoice = relationship(Invoice)
  36.  
  37.     def __init__(self, val, str_type):
  38.         self.type = str_type.lower()
  39.         setattr(self, self.type, val)
  40.  
  41.     def __repr__(self):
  42.         return 'Type:{}'.format(self.type)
  43.  
  44.     @hybrid_property
  45.     def value(self):
  46.         return getattr(self, self.type)
  47.  
  48.  
  49. Base.metadata.create_all(sa_engine)
  50.  
  51. order = Order()
  52. invoice = Invoice()
  53. invoice.number = '00001'
  54.  
  55. pbl1 = Payable(invoice, 'Invoice')
  56. pbl2 = Payable(order, 'Order')
  57.  
  58. s.add(invoice)
  59. s.add(order)
  60. s.add(pbl1)
  61. s.add(pbl2)
  62.  
  63. s.commit()
  64. print(pbl1.value.number) #this works
  65. res = s.query(Payable).filter(Payable.type=='order').all() #this works
  66. res = s.query(Payable).filter(Payable.order==order).all() #this works too
  67. res = s.query(Payable).filter(Payable.value==order).all() #this does not
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement