⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 attributes.py

📁 SQLAlchemy. 经典的Python ORM框架。学习必看。
💻 PY
字号:
"""A couple of helper descriptors to allow to use the same code as querycriterion creators and as instance code. As this doesn't do advancedmagic recompiling, you can only use basic expression-like code."""import newclass MethodDescriptor(object):    def __init__(self, func):        self.func = func    def __get__(self, instance, owner):        if instance is None:            return new.instancemethod(self.func, owner, owner.__class__)        else:            return new.instancemethod(self.func, instance, owner)class PropertyDescriptor(object):    def __init__(self, fget, fset, fdel):        self.fget = fget        self.fset = fset        self.fdel = fdel    def __get__(self, instance, owner):        if instance is None:            return self.fget(owner)        else:            return self.fget(instance)    def __set__(self, instance, value):        self.fset(instance, value)    def __delete__(self, instance):        self.fdel(instance)        def hybrid(func):    return MethodDescriptor(func)def hybrid_property(fget, fset=None, fdel=None):    return PropertyDescriptor(fget, fset, fdel)### Example codefrom sqlalchemy import *from sqlalchemy.orm import *metadata = MetaData('sqlite://')metadata.bind.echo = Trueprint "Set up database metadata"interval_table1 = Table('interval1', metadata,    Column('id', Integer, primary_key=True),    Column('start', Integer, nullable=False),    Column('end', Integer, nullable=False))interval_table2 = Table('interval2', metadata,    Column('id', Integer, primary_key=True),    Column('start', Integer, nullable=False),    Column('length', Integer, nullable=False))metadata.create_all()# A base class for intervalsclass BaseInterval(object):    @hybrid    def contains(self,point):        return (self.start <= point) & (point < self.end)        @hybrid    def intersects(self, other):        return (self.start < other.end) & (self.end > other.start)    def __repr__(self):        return "%s(%s..%s)" % (self.__class__.__name__, self.start, self.end)# Interval stored as endpointsclass Interval1(BaseInterval):    def __init__(self, start, end):        self.start = start        self.end = end        length = hybrid_property(lambda s: s.end - s.start)mapper(Interval1, interval_table1)# Interval stored as start and lengthclass Interval2(BaseInterval):    def __init__(self, start, length):        self.start = start        self.length = length        end = hybrid_property(lambda s: s.start + s.length)mapper(Interval2, interval_table2)print "Create the data"session = create_session()intervals = [Interval1(1,4), Interval1(3,15), Interval1(11,16)]for interval in intervals:    session.save(interval)    session.save(Interval2(interval.start, interval.length))session.flush()print "Clear the cache and do some queries"session.clear()for Interval in (Interval1, Interval2):    print "Querying using interval class %s" % Interval.__name__        print    print '-- length less than 10'    print [(i, i.length) for i in session.query(Interval).filter(Interval.length < 10).all()]        print    print '-- contains 12'    print session.query(Interval).filter(Interval.contains(12)).all()        print    print '-- intersects 2..10'    other = Interval1(2,10)    result = session.query(Interval).filter(Interval.intersects(other)).order_by(Interval.length).all()    print [(interval, interval.intersects(other)) for interval in result]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -