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

📄 expire.py

📁 SQLAlchemy. 经典的Python ORM框架。学习必看。
💻 PY
📖 第 1 页 / 共 2 页
字号:
        mapper(Address, addresses)        sess = create_session()        u = sess.query(User).get(8)        sess.expire(u, ['name', 'addresses'])        assert 'name' not in u.__dict__        assert 'addresses' not in u.__dict__        def go():            assert u.addresses[0].email_address=='ed@wood.com'        self.assert_sql_count(testing.db, go, 1)        # check that mods to expired eager-load attributes        # do the refresh        sess.expire(u, ['name', 'addresses'])        def go():            u.addresses = [Address(id=10, email_address='foo@bar.com')]        self.assert_sql_count(testing.db, go, 1)        sess.flush()        # this should ideally trigger the whole load        # but currently it works like the lazy case        def go():            assert u.addresses[0].email_address=='foo@bar.com'            assert len(u.addresses) == 1        self.assert_sql_count(testing.db, go, 0)        def go():            assert u.name == 'ed'        # scalar attributes have their own load        self.assert_sql_count(testing.db, go, 1)        # ideally, this was already loaded, but we arent        # doing it that way right now        #self.assert_sql_count(testing.db, go, 0)    def test_relations_load_on_query(self):        mapper(User, users, properties={            'addresses':relation(Address, backref='user'),            })        mapper(Address, addresses)        sess = create_session()        u = sess.query(User).get(8)        assert 'name' in u.__dict__        u.addresses        assert 'addresses' in u.__dict__        sess.expire(u, ['name', 'addresses'])        assert 'name' not in u.__dict__        assert 'addresses' not in u.__dict__        sess.query(User).options(eagerload('addresses')).filter_by(id=8).all()        assert 'name' in u.__dict__        assert 'addresses' in u.__dict__            def test_partial_expire_deferred(self):        mapper(Order, orders, properties={            'description':deferred(orders.c.description)        })        sess = create_session()        o = sess.query(Order).get(3)        sess.expire(o, ['description', 'isopen'])        assert 'isopen' not in o.__dict__        assert 'description' not in o.__dict__        # test that expired attribute access refreshes        # the deferred        def go():            assert o.isopen == 1            assert o.description == 'order 3'        self.assert_sql_count(testing.db, go, 1)        sess.expire(o, ['description', 'isopen'])        assert 'isopen' not in o.__dict__        assert 'description' not in o.__dict__        # test that the deferred attribute triggers the full        # reload        def go():            assert o.description == 'order 3'            assert o.isopen == 1        self.assert_sql_count(testing.db, go, 1)        clear_mappers()        mapper(Order, orders)        sess.clear()        # same tests, using deferred at the options level        o = sess.query(Order).options(defer('description')).get(3)        assert 'description' not in o.__dict__        # sanity check        def go():            assert o.description == 'order 3'        self.assert_sql_count(testing.db, go, 1)        assert 'description' in o.__dict__        assert 'isopen' in o.__dict__        sess.expire(o, ['description', 'isopen'])        assert 'isopen' not in o.__dict__        assert 'description' not in o.__dict__        # test that expired attribute access refreshes        # the deferred        def go():            assert o.isopen == 1            assert o.description == 'order 3'        self.assert_sql_count(testing.db, go, 1)        sess.expire(o, ['description', 'isopen'])        assert 'isopen' not in o.__dict__        assert 'description' not in o.__dict__        # test that the deferred attribute triggers the full        # reload        def go():            assert o.description == 'order 3'            assert o.isopen == 1        self.assert_sql_count(testing.db, go, 1)        def test_eagerload_query_refreshes(self):        mapper(User, users, properties={            'addresses':relation(Address, backref='user', lazy=False),            })        mapper(Address, addresses)        sess = create_session()        u = sess.query(User).get(8)        assert len(u.addresses) == 3        sess.expire(u)        assert 'addresses' not in u.__dict__        print "-------------------------------------------"        sess.query(User).filter_by(id=8).all()        assert 'addresses' in u.__dict__        assert len(u.addresses) == 3            def test_expire_all(self):        mapper(User, users, properties={            'addresses':relation(Address, backref='user', lazy=False),            })        mapper(Address, addresses)        sess = create_session()        userlist = sess.query(User).all()        assert fixtures.user_address_result == userlist        assert len(list(sess)) == 9        sess.expire_all()        gc.collect()        assert len(list(sess)) == 4 # since addresses were gc'ed                userlist = sess.query(User).all()        u = userlist[1]        assert fixtures.user_address_result == userlist        assert len(list(sess)) == 9        class PolymorphicExpireTest(ORMTest):    keep_data = True        def define_tables(self, metadata):        global people, engineers, Person, Engineer        people = Table('people', metadata,           Column('person_id', Integer, Sequence('person_id_seq', optional=True), primary_key=True),           Column('name', String(50)),           Column('type', String(30)))        engineers = Table('engineers', metadata,           Column('person_id', Integer, ForeignKey('people.person_id'), primary_key=True),           Column('status', String(30)),          )                class Person(Base):            pass        class Engineer(Person):            pass                def insert_data(self):        people.insert().execute(            {'person_id':1, 'name':'person1', 'type':'person'},            {'person_id':2, 'name':'engineer1', 'type':'engineer'},            {'person_id':3, 'name':'engineer2', 'type':'engineer'},        )        engineers.insert().execute(            {'person_id':2, 'status':'new engineer'},            {'person_id':3, 'status':'old engineer'},        )    def test_poly_select(self):        mapper(Person, people, polymorphic_on=people.c.type, polymorphic_identity='person')        mapper(Engineer, engineers, inherits=Person, polymorphic_identity='engineer')                sess = create_session()        [p1, e1, e2] = sess.query(Person).order_by(people.c.person_id).all()                sess.expire(p1)        sess.expire(e1, ['status'])        sess.expire(e2)                for p in [p1, e2]:            assert 'name' not in p.__dict__                assert 'name' in e1.__dict__        assert 'status' not in e2.__dict__        assert 'status' not in e1.__dict__                e1.name = 'new engineer name'                def go():            sess.query(Person).all()        self.assert_sql_count(testing.db, go, 3)                for p in [p1, e1, e2]:            assert 'name' in p.__dict__                assert 'status' in e2.__dict__        assert 'status' in e1.__dict__        def go():            assert e1.name == 'new engineer name'            assert e2.name == 'engineer2'            assert e1.status == 'new engineer'        self.assert_sql_count(testing.db, go, 0)        self.assertEquals(Engineer.name.get_history(e1), (['new engineer name'], [], ['engineer1']))            def test_poly_deferred(self):        mapper(Person, people, polymorphic_on=people.c.type, polymorphic_identity='person', polymorphic_fetch='deferred')        mapper(Engineer, engineers, inherits=Person, polymorphic_identity='engineer')        sess = create_session()        [p1, e1, e2] = sess.query(Person).order_by(people.c.person_id).all()        sess.expire(p1)        sess.expire(e1, ['status'])        sess.expire(e2)        for p in [p1, e2]:            assert 'name' not in p.__dict__        assert 'name' in e1.__dict__        assert 'status' not in e2.__dict__        assert 'status' not in e1.__dict__        e1.name = 'new engineer name'        def go():            sess.query(Person).all()        self.assert_sql_count(testing.db, go, 1)                for p in [p1, e1, e2]:            assert 'name' in p.__dict__        assert 'status' not in e2.__dict__        assert 'status' not in e1.__dict__        def go():            assert e1.name == 'new engineer name'            assert e2.name == 'engineer2'            assert e1.status == 'new engineer'            assert e2.status == 'old engineer'        self.assert_sql_count(testing.db, go, 2)        self.assertEquals(Engineer.name.get_history(e1), (['new engineer name'], [], ['engineer1']))            class RefreshTest(FixtureTest):    keep_mappers = False    refresh_data = True    def test_refresh(self):        mapper(User, users, properties={            'addresses':relation(mapper(Address, addresses), backref='user')        })        s = create_session()        u = s.get(User, 7)        u.name = 'foo'        a = Address()        assert object_session(a) is None        u.addresses.append(a)        assert a.email_address is None        assert id(a) in [id(x) for x in u.addresses]        s.refresh(u)        # its refreshed, so not dirty        assert u not in s.dirty        # username is back to the DB        assert u.name == 'jack'        assert id(a) not in [id(x) for x in u.addresses]        u.name = 'foo'        u.addresses.append(a)        # now its dirty        assert u in s.dirty        assert u.name == 'foo'        assert id(a) in [id(x) for x in u.addresses]        s.expire(u)        # get the attribute, it refreshes        print "OK------"#        print u.__dict__#        print u._state.callables        assert u.name == 'jack'        assert id(a) not in [id(x) for x in u.addresses]    def test_refresh_expired(self):        mapper(User, users)        s = create_session()        u = s.get(User, 7)        s.expire(u)        assert 'name' not in u.__dict__        s.refresh(u)        assert u.name == 'jack'    def test_refresh_with_lazy(self):        """test that when a lazy loader is set as a trigger on an object's attribute        (at the attribute level, not the class level), a refresh() operation doesnt        fire the lazy loader or create any problems"""        s = create_session()        mapper(User, users, properties={'addresses':relation(mapper(Address, addresses))})        q = s.query(User).options(lazyload('addresses'))        u = q.filter(users.c.id==8).first()        def go():            s.refresh(u)        self.assert_sql_count(testing.db, go, 1)    def test_refresh_with_eager(self):        """test that a refresh/expire operation loads rows properly and sends correct "isnew" state to eager loaders"""        mapper(User, users, properties={            'addresses':relation(mapper(Address, addresses), lazy=False)        })        s = create_session()        u = s.get(User, 8)        assert len(u.addresses) == 3        s.refresh(u)        assert len(u.addresses) == 3        s = create_session()        u = s.get(User, 8)        assert len(u.addresses) == 3        s.expire(u)        assert len(u.addresses) == 3    @testing.fails_on('maxdb')    def test_refresh2(self):        """test a hang condition that was occuring on expire/refresh"""        s = create_session()        mapper(Address, addresses)        mapper(User, users, properties = dict(addresses=relation(Address,cascade="all, delete-orphan",lazy=False)) )        u=User()        u.name='Justin'        a = Address(id=10, email_address='lala')        u.addresses.append(a)        s.save(u)        s.flush()        s.clear()        u = s.query(User).filter(User.name=='Justin').one()        s.expire(u)        assert u.name == 'Justin'        s.refresh(u)if __name__ == '__main__':    testenv.main()

⌨️ 快捷键说明

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