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

📄 associationproxy.py

📁 SQLAlchemy. 经典的Python ORM框架。学习必看。
💻 PY
📖 第 1 页 / 共 2 页
字号:
import testenv; testenv.configure_for_tests()from sqlalchemy import *from sqlalchemy.orm import *from sqlalchemy.orm.collections import collectionfrom sqlalchemy.ext.associationproxy import *from testlib import *class DictCollection(dict):    @collection.appender    def append(self, obj):        self[obj.foo] = obj    @collection.remover    def remove(self, obj):        del self[obj.foo]class SetCollection(set):    passclass ListCollection(list):    passclass ObjectCollection(object):    def __init__(self):        self.values = list()    @collection.appender    def append(self, obj):        self.values.append(obj)    @collection.remover    def remove(self, obj):        self.values.remove(obj)    def __iter__(self):        return iter(self.values)class _CollectionOperations(TestBase):    def setUp(self):        collection_class = self.collection_class        metadata = MetaData(testing.db)        parents_table = Table('Parent', metadata,                              Column('id', Integer, primary_key=True),                              Column('name', String(128)))        children_table = Table('Children', metadata,                               Column('id', Integer, primary_key=True),                               Column('parent_id', Integer,                                      ForeignKey('Parent.id')),                               Column('foo', String(128)),                               Column('name', String(128)))        class Parent(object):            children = association_proxy('_children', 'name')            def __init__(self, name):                self.name = name        class Child(object):            if collection_class and issubclass(collection_class, dict):                def __init__(self, foo, name):                    self.foo = foo                    self.name = name            else:                def __init__(self, name):                    self.name = name        mapper(Parent, parents_table, properties={            '_children': relation(Child, lazy=False,                                  collection_class=collection_class)})        mapper(Child, children_table)        metadata.create_all()        self.metadata = metadata        self.session = create_session()        self.Parent, self.Child = Parent, Child    def tearDown(self):        self.metadata.drop_all()    def roundtrip(self, obj):        if obj not in self.session:            self.session.save(obj)        self.session.flush()        id, type_ = obj.id, type(obj)        self.session.clear()        return self.session.query(type_).get(id)    def _test_sequence_ops(self):        Parent, Child = self.Parent, self.Child        p1 = Parent('P1')        self.assert_(not p1._children)        self.assert_(not p1.children)        ch = Child('regular')        p1._children.append(ch)        self.assert_(ch in p1._children)        self.assert_(len(p1._children) == 1)        self.assert_(p1.children)        self.assert_(len(p1.children) == 1)        self.assert_(ch not in p1.children)        self.assert_('regular' in p1.children)        p1.children.append('proxied')        self.assert_('proxied' in p1.children)        self.assert_('proxied' not in p1._children)        self.assert_(len(p1.children) == 2)        self.assert_(len(p1._children) == 2)        self.assert_(p1._children[0].name == 'regular')        self.assert_(p1._children[1].name == 'proxied')        del p1._children[1]        self.assert_(len(p1._children) == 1)        self.assert_(len(p1.children) == 1)        self.assert_(p1._children[0] == ch)        del p1.children[0]        self.assert_(len(p1._children) == 0)        self.assert_(len(p1.children) == 0)        p1.children = ['a','b','c']        self.assert_(len(p1._children) == 3)        self.assert_(len(p1.children) == 3)        del ch        p1 = self.roundtrip(p1)        self.assert_(len(p1._children) == 3)        self.assert_(len(p1.children) == 3)        popped = p1.children.pop()        self.assert_(len(p1.children) == 2)        self.assert_(popped not in p1.children)        p1 = self.roundtrip(p1)        self.assert_(len(p1.children) == 2)        self.assert_(popped not in p1.children)        p1.children[1] = 'changed-in-place'        self.assert_(p1.children[1] == 'changed-in-place')        inplace_id = p1._children[1].id        p1 = self.roundtrip(p1)        self.assert_(p1.children[1] == 'changed-in-place')        assert p1._children[1].id == inplace_id        p1.children.append('changed-in-place')        self.assert_(p1.children.count('changed-in-place') == 2)        p1.children.remove('changed-in-place')        self.assert_(p1.children.count('changed-in-place') == 1)        p1 = self.roundtrip(p1)        self.assert_(p1.children.count('changed-in-place') == 1)        p1._children = []        self.assert_(len(p1.children) == 0)        after = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']        p1.children = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']        self.assert_(len(p1.children) == 10)        self.assert_([c.name for c in p1._children] == after)        p1.children[2:6] = ['x'] * 4        after = ['a', 'b', 'x', 'x', 'x', 'x', 'g', 'h', 'i', 'j']        self.assert_(p1.children == after)        self.assert_([c.name for c in p1._children] == after)        p1.children[2:6] = ['y']        after = ['a', 'b', 'y', 'g', 'h', 'i', 'j']        self.assert_(p1.children == after)        self.assert_([c.name for c in p1._children] == after)        p1.children[2:3] = ['z'] * 4        after = ['a', 'b', 'z', 'z', 'z', 'z', 'g', 'h', 'i', 'j']        self.assert_(p1.children == after)        self.assert_([c.name for c in p1._children] == after)        p1.children[2::2] = ['O'] * 4        after = ['a', 'b', 'O', 'z', 'O', 'z', 'O', 'h', 'O', 'j']        self.assert_(p1.children == after)        self.assert_([c.name for c in p1._children] == after)        self.assertRaises(TypeError, set, [p1.children])        p1.children *= 0        after = []        self.assert_(p1.children == after)        self.assert_([c.name for c in p1._children] == after)        p1.children += ['a', 'b']        after = ['a', 'b']        self.assert_(p1.children == after)        self.assert_([c.name for c in p1._children] == after)        p1.children += ['c']        after = ['a', 'b', 'c']        self.assert_(p1.children == after)        self.assert_([c.name for c in p1._children] == after)        p1.children *= 1        after = ['a', 'b', 'c']        self.assert_(p1.children == after)        self.assert_([c.name for c in p1._children] == after)        p1.children *= 2        after = ['a', 'b', 'c', 'a', 'b', 'c']        self.assert_(p1.children == after)        self.assert_([c.name for c in p1._children] == after)        p1.children = ['a']        after = ['a']        self.assert_(p1.children == after)        self.assert_([c.name for c in p1._children] == after)        self.assert_((p1.children * 2) == ['a', 'a'])        self.assert_((2 * p1.children) == ['a', 'a'])        self.assert_((p1.children * 0) == [])        self.assert_((0 * p1.children) == [])        self.assert_((p1.children + ['b']) == ['a', 'b'])        self.assert_((['b'] + p1.children) == ['b', 'a'])        try:            p1.children + 123            assert False        except TypeError:            assert Trueclass DefaultTest(_CollectionOperations):    def __init__(self, *args, **kw):        super(DefaultTest, self).__init__(*args, **kw)        self.collection_class = None    def test_sequence_ops(self):        self._test_sequence_ops()class ListTest(_CollectionOperations):    def __init__(self, *args, **kw):        super(ListTest, self).__init__(*args, **kw)        self.collection_class = list    def test_sequence_ops(self):        self._test_sequence_ops()class CustomListTest(ListTest):    def __init__(self, *args, **kw):        super(CustomListTest, self).__init__(*args, **kw)        self.collection_class = list# No-can-do until ticket #213class DictTest(_CollectionOperations):    passclass CustomDictTest(DictTest):    def __init__(self, *args, **kw):        super(DictTest, self).__init__(*args, **kw)        self.collection_class = DictCollection    def test_mapping_ops(self):        Parent, Child = self.Parent, self.Child        p1 = Parent('P1')        self.assert_(not p1._children)        self.assert_(not p1.children)        ch = Child('a', 'regular')        p1._children.append(ch)        self.assert_(ch in p1._children.values())        self.assert_(len(p1._children) == 1)        self.assert_(p1.children)        self.assert_(len(p1.children) == 1)        self.assert_(ch not in p1.children)        self.assert_('a' in p1.children)        self.assert_(p1.children['a'] == 'regular')        self.assert_(p1._children['a'] == ch)        p1.children['b'] = 'proxied'        self.assert_('proxied' in p1.children.values())        self.assert_('b' in p1.children)        self.assert_('proxied' not in p1._children)        self.assert_(len(p1.children) == 2)        self.assert_(len(p1._children) == 2)        self.assert_(p1._children['a'].name == 'regular')        self.assert_(p1._children['b'].name == 'proxied')        del p1._children['b']        self.assert_(len(p1._children) == 1)        self.assert_(len(p1.children) == 1)        self.assert_(p1._children['a'] == ch)        del p1.children['a']        self.assert_(len(p1._children) == 0)        self.assert_(len(p1.children) == 0)        p1.children = {'d': 'v d', 'e': 'v e', 'f': 'v f'}        self.assert_(len(p1._children) == 3)        self.assert_(len(p1.children) == 3)        self.assert_(set(p1.children) == set(['d','e','f']))        del ch        p1 = self.roundtrip(p1)        self.assert_(len(p1._children) == 3)        self.assert_(len(p1.children) == 3)        p1.children['e'] = 'changed-in-place'        self.assert_(p1.children['e'] == 'changed-in-place')        inplace_id = p1._children['e'].id        p1 = self.roundtrip(p1)        self.assert_(p1.children['e'] == 'changed-in-place')        self.assert_(p1._children['e'].id == inplace_id)        p1._children = {}        self.assert_(len(p1.children) == 0)        try:            p1._children = []            self.assert_(False)        except TypeError:            self.assert_(True)        try:            p1._children = None            self.assert_(False)        except TypeError:            self.assert_(True)        self.assertRaises(TypeError, set, [p1.children])class SetTest(_CollectionOperations):    def __init__(self, *args, **kw):        super(SetTest, self).__init__(*args, **kw)        self.collection_class = set    def test_set_operations(self):        Parent, Child = self.Parent, self.Child        p1 = Parent('P1')        self.assert_(not p1._children)        self.assert_(not p1.children)        ch1 = Child('regular')        p1._children.add(ch1)        self.assert_(ch1 in p1._children)        self.assert_(len(p1._children) == 1)        self.assert_(p1.children)        self.assert_(len(p1.children) == 1)        self.assert_(ch1 not in p1.children)        self.assert_('regular' in p1.children)        p1.children.add('proxied')        self.assert_('proxied' in p1.children)        self.assert_('proxied' not in p1._children)        self.assert_(len(p1.children) == 2)        self.assert_(len(p1._children) == 2)        self.assert_(set([o.name for o in p1._children]) ==                     set(['regular', 'proxied']))        ch2 = None        for o in p1._children:            if o.name == 'proxied':                ch2 = o                break        p1._children.remove(ch2)        self.assert_(len(p1._children) == 1)        self.assert_(len(p1.children) == 1)        self.assert_(p1._children == set([ch1]))        p1.children.remove('regular')        self.assert_(len(p1._children) == 0)        self.assert_(len(p1.children) == 0)        p1.children = ['a','b','c']        self.assert_(len(p1._children) == 3)        self.assert_(len(p1.children) == 3)        del ch1        p1 = self.roundtrip(p1)        self.assert_(len(p1._children) == 3)        self.assert_(len(p1.children) == 3)        self.assert_('a' in p1.children)        self.assert_('b' in p1.children)        self.assert_('d' not in p1.children)

⌨️ 快捷键说明

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