Advertisement
Guest User

Untitled

a guest
Aug 19th, 2013
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.57 KB | None | 0 0
  1. from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
  2. from sqlalchemy.orm import sessionmaker, relationship, joinedload
  3. from sqlalchemy.ext.declarative import declarative_base, declared_attr
  4. from sqlalchemy.ext.hybrid import hybrid_method, hybrid_property, Comparator
  5. from sqlalchemy.sql import select
  6.  
  7. class BaseCFG(object):
  8.     @declared_attr
  9.     def __tablename__(cls):  # @NoSelf
  10.         return cls.__name__.lower()
  11.  
  12. engine = create_engine('sqlite:///:memory:', echo=True)
  13. Base = declarative_base(cls=BaseCFG)
  14. Session = sessionmaker(bind=engine)
  15. session = Session()
  16.  
  17.  
  18. def filter_locale(locale):
  19.     def transform(query):
  20.         return query.join(ItemI18N).filter(ItemI18N.lang_short == "en").options(joinedload("i18ns"))
  21.     return transform
  22.  
  23. class Item(Base):
  24.     id = Column(Integer, primary_key=True)
  25.     data = Column(String)
  26.     i18ns = relationship("ItemI18N", backref="item", cascade="all, delete-orphan", lazy="joined")
  27.  
  28.     def name(self, locale):
  29.         for i18n in self.i18ns:
  30.             if i18n.language.short == locale:
  31.                 return i18n.name
  32.  
  33. class ItemI18N(Base):
  34.     lang_id = Column(Integer, ForeignKey('language.id'), primary_key=True)
  35.     item_id = Column(Integer, ForeignKey('item.id'), primary_key=True)
  36.     name = Column(String)
  37.     language = relationship("Language", lazy="joined")
  38.  
  39.  
  40. class Language(Base):
  41.     id = Column(Integer, primary_key=True)
  42.     short = Column(String)
  43.  
  44. Base.metadata.create_all(engine)
  45.  
  46. # Init data
  47. en = Language(short="en")
  48. de = Language(short="de")
  49. session.add_all([en, de])
  50. item = Item(data="item")
  51. item_en = ItemI18N(name="English Name")
  52. item_en.language = en
  53. item.i18ns.append(item_en)
  54. item_de = ItemI18N(name="German Name")
  55. item_de.language = de
  56. item.i18ns.append(item_de)
  57. session.add(item)
  58. session.flush()
  59. session.expunge(item)
  60.  
  61. # Use it as a list
  62. #item = session.query(Item).first()
  63. #print item.data, [i18n.name for i18n in item.i18ns if i18n.lang_short == "en"][0]
  64.  
  65. # Get the name separately
  66. #item, name = session.query(Item, ItemI18N).join(ItemI18N).filter(ItemI18N.lang_short == "en").first()
  67. #print item.data, name
  68.  
  69. # Hybrid
  70. #[item] = session.query(Item).join(ItemI18N).filter(ItemI18N.lang_short == "en").options(joinedload("i18ns")).all()
  71. #print item.data, item.name("en")
  72.  
  73. #[item] = session.query(Item).with_transformation(filter_locale("en")).all()
  74. #print item.data, item.name("en")
  75.  
  76. [item] = session.query(Item).all()
  77. print item.data, item.name("en")
  78.  
  79. #name = session.query(Item.name).join(Item).filter(ItemI18N.lang_short == "en").all()
  80. #print name
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement