Example #1
0
 def setup_mappers(self):
     # set up bi-directional eager loads
     mapper(Left, left)
     mapper(Right, right)
     mapper(Middle, middle, properties=dict(
         left=relation(Left,
                       lazy=False,
                       backref=backref('middle',lazy=False)),
         right=relation(Right,
                        lazy=False,
                        backref=backref('middle', lazy=False)))),
Example #2
0
 def setup_mappers(self):
     # set up bi-directional eager loads
     mapper(Left, left)
     mapper(Right, right)
     mapper(Middle,
            middle,
            properties=dict(left=relation(Left,
                                          lazy=False,
                                          backref=backref('middle',
                                                          lazy=False)),
                            right=relation(Right,
                                           lazy=False,
                                           backref=backref('middle',
                                                           lazy=False)))),
Example #3
0
    def setup_mappers(self):
        mapper(Account, accounts)

        mapper(Transaction, transactions)

        mapper(Entry, entries, properties=dict(
            account=relation(Account,
                             uselist=False,
                             backref=backref('entries', lazy=True,
                                             order_by=entries.c.entry_id)),
            transaction=relation(Transaction,
                                 uselist=False,
                                 backref=backref('entries', lazy=False,
                                                 order_by=entries.c.entry_id))))
Example #4
0
    def test_single_parent_backref(self):
        """test that setting m2m via a uselist=False backref bypasses the single_parent raise"""

        mapper(
            A,
            a,
            properties={
                "bs": relation(
                    B,
                    secondary=atob,
                    cascade="all, delete-orphan",
                    single_parent=True,
                    backref=backref("a", uselist=False),
                )
            },
        )
        mapper(B, b)

        sess = create_session()
        b1 = B(data="b1")
        a1 = A(data="a1", bs=[b1])

        self.assertRaises(sa_exc.InvalidRequestError, A, data="a2", bs=[b1])

        a2 = A(data="a2")
        b1.a = a2
        assert b1 not in a1.bs
        assert b1 in a2.bs
Example #5
0
    def test_one(self):
        p_m = mapper(Part, parts)

        mapper(InheritedPart, inherited_part, properties=dict(
            part=relation(Part, lazy=False)))

        d_m = mapper(Design, design, properties=dict(
            inheritedParts=relation(InheritedPart,
                                    cascade="all, delete-orphan",
                                    backref="design")))

        mapper(DesignType, design_types)

        d_m.add_property(
            "type", relation(DesignType, lazy=False, backref="designs"))

        p_m.add_property(
            "design", relation(
                Design, lazy=False,
                backref=backref("parts", cascade="all, delete-orphan")))


        d = Design()
        sess = create_session()
        sess.add(d)
        sess.flush()
        sess.expunge_all()
        x = sess.query(Design).get(1)
        x.inheritedParts
Example #6
0
    def test_one(self):
        p_m = mapper(Part, parts)

        mapper(InheritedPart,
               inherited_part,
               properties=dict(part=relation(Part, lazy=False)))

        d_m = mapper(
            Design,
            design,
            properties=dict(inheritedParts=relation(
                InheritedPart, cascade="all, delete-orphan",
                backref="design")))

        mapper(DesignType, design_types)

        d_m.add_property("type",
                         relation(DesignType, lazy=False, backref="designs"))

        p_m.add_property(
            "design",
            relation(Design,
                     lazy=False,
                     backref=backref("parts", cascade="all, delete-orphan")))

        d = Design()
        sess = create_session()
        sess.add(d)
        sess.flush()
        sess.clear()
        x = sess.query(Design).get(1)
        x.inheritedParts
Example #7
0
 def setup_mappers(self):
     mapper(Address, addresses)
     mapper(
         User,
         users,
         properties={"address": relation(Address, backref=backref("user", single_parent=True), uselist=False)},
     )
Example #8
0
 def setup_mappers(self):
     mapper(TT,
            item,
            properties={
                'children':
                relation(TT,
                         remote_side=[item.c.parent_uuid],
                         backref=backref('parent',
                                         remote_side=[item.c.uuid]))
            })
Example #9
0
    def test_nesting_with_functions(self):
        mapper(Data, datas)
        mapper(Foo, foo, properties={"data": relation(Data, backref=backref("foo", uselist=False))})

        mapper(Stat, stats, properties={"data": relation(Data)})

        session = create_session()

        data = [Data(a=x) for x in range(5)]
        session.add_all(data)

        session.add_all(
            (
                Stat(data=data[0], somedata=1),
                Stat(data=data[1], somedata=2),
                Stat(data=data[2], somedata=3),
                Stat(data=data[3], somedata=4),
                Stat(data=data[4], somedata=5),
                Stat(data=data[0], somedata=6),
                Stat(data=data[1], somedata=7),
                Stat(data=data[2], somedata=8),
                Stat(data=data[3], somedata=9),
                Stat(data=data[4], somedata=10),
            )
        )
        session.flush()

        arb_data = sa.select(
            [stats.c.data_id, sa.func.max(stats.c.somedata).label("max")],
            stats.c.data_id <= 5,
            group_by=[stats.c.data_id],
        ).alias("arb")

        arb_result = arb_data.execute().fetchall()

        # order the result list descending based on 'max'
        arb_result.sort(key=lambda a: a["max"], reverse=True)

        # extract just the "data_id" from it
        arb_result = [row["data_id"] for row in arb_result]

        # now query for Data objects using that above select, adding the
        # "order by max desc" separately
        q = (
            session.query(Data)
            .options(sa.orm.eagerload("foo"))
            .select_from(datas.join(arb_data, arb_data.c.data_id == datas.c.id))
            .order_by(sa.desc(arb_data.c.max))
            .limit(10)
        )

        # extract "data_id" from the list of result objects
        verify_result = [d.id for d in q]

        eq_(verify_result, arb_result)
Example #10
0
    def setup_mappers(self):
        mapper(Account, accounts)

        mapper(Transaction, transactions)

        mapper(Entry,
               entries,
               properties=dict(account=relation(
                   Account,
                   uselist=False,
                   backref=backref('entries',
                                   lazy=True,
                                   order_by=entries.c.entry_id)),
                               transaction=relation(
                                   Transaction,
                                   uselist=False,
                                   backref=backref(
                                       'entries',
                                       lazy=False,
                                       order_by=entries.c.entry_id))))
Example #11
0
    def test_expunge_cascade(self):
        mapper(Address, addresses)
        mapper(User, users, properties={
            'addresses':relation(Address,
                                 backref=backref("user", cascade="all"),
                                 cascade="all")})

        _fixtures.run_inserts_for(users)
        _fixtures.run_inserts_for(addresses)

        session = create_session()
        u = session.query(User).filter_by(id=7).one()

        # get everything to load in both directions
        print [a.user for a in u.addresses]
Example #12
0
    def test_nesting_with_functions(self):
        mapper(Data, datas)
        mapper(Foo,
               foo,
               properties={
                   'data': relation(Data,
                                    backref=backref('foo', uselist=False))
               })

        mapper(Stat, stats, properties={'data': relation(Data)})

        session = create_session()

        data = [Data(a=x) for x in range(5)]
        session.add_all(data)

        session.add_all(
            (Stat(data=data[0], somedata=1), Stat(data=data[1], somedata=2),
             Stat(data=data[2], somedata=3), Stat(data=data[3], somedata=4),
             Stat(data=data[4], somedata=5), Stat(data=data[0], somedata=6),
             Stat(data=data[1], somedata=7), Stat(data=data[2], somedata=8),
             Stat(data=data[3], somedata=9), Stat(data=data[4], somedata=10)))
        session.flush()

        arb_data = sa.select(
            [stats.c.data_id,
             sa.func.max(stats.c.somedata).label('max')],
            stats.c.data_id <= 5,
            group_by=[stats.c.data_id]).alias('arb')

        arb_result = arb_data.execute().fetchall()

        # order the result list descending based on 'max'
        arb_result.sort(key=lambda a: a['max'], reverse=True)

        # extract just the "data_id" from it
        arb_result = [row['data_id'] for row in arb_result]

        # now query for Data objects using that above select, adding the
        # "order by max desc" separately
        q = (session.query(Data).options(sa.orm.eagerload('foo')).select_from(
            datas.join(arb_data, arb_data.c.data_id == datas.c.id)).order_by(
                sa.desc(arb_data.c.max)).limit(10))

        # extract "data_id" from the list of result objects
        verify_result = [d.id for d in q]

        eq_(verify_result, arb_result)
Example #13
0
    def test_no_save_cascade_2(self):
        mapper(Address, addresses)
        mapper(User, users, properties=dict(
            addresses=relation(Address,
                               cascade="all",
                               backref=backref("user", cascade="none"))))

        s = create_session()
        u = User(name='u1')
        a = Address(email_address='u1@e')
        a.user = u
        s.add(a)
        assert u not in s
        assert a in s
        s.flush()
        s.expunge_all()
        assert s.query(Address).one().id == a.id
        assert s.query(User).first() is None
Example #14
0
    def test_no_save_cascade_2(self):
        mapper(Address, addresses)
        mapper(User, users, properties=dict(
            addresses=relation(Address,
                               cascade="all",
                               backref=backref("user", cascade="none"))))

        s = create_session()
        u = User(name='u1')
        a = Address(email_address='u1@e')
        a.user = u
        s.add(a)
        assert u not in s
        assert a in s
        s.flush()
        s.clear()
        assert s.query(Address).one().id == a.id
        assert s.query(User).first() is None
Example #15
0
    def test_unidirectional_cascade_o2m(self):
        mapper(Order, orders)
        mapper(User, users, properties=dict(orders=relation(Order, backref=backref("user", cascade=None))))

        sess = create_session()

        o1 = Order()
        sess.add(o1)
        u1 = User(orders=[o1])
        assert u1 not in sess
        assert o1 in sess

        sess.expunge_all()

        o1 = Order()
        u1 = User(orders=[o1])
        sess.add(o1)
        assert u1 not in sess
        assert o1 in sess
Example #16
0
    def test_mapped_binds_from_expression(self):
        """Session can extract Table objects from ClauseElements and match them to tables."""

        mapper(Address, addresses)
        mapper(User, users, properties={
            'addresses':relation(Address,
                                 backref=backref("user", cascade="all"),
                                 cascade="all")})

        Session = sessionmaker(binds={User: self.metadata.bind,
                                      Address: self.metadata.bind})
        sess = Session()

        sess.execute(users.insert(), params=dict(id=1, name='ed'))
        eq_(sess.execute(users.select(users.c.id == 1)).fetchall(),
            [(1, 'ed')])

        eq_(sess.execute(users.select(User.id == 1)).fetchall(),
            [(1, 'ed')])

        sess.close()
Example #17
0
    def test_mapped_binds_from_expression(self):
        """Session can extract Table objects from ClauseElements and match them to tables."""

        mapper(Address, addresses)
        mapper(User, users, properties={
            'addresses':relation(Address,
                                 backref=backref("user", cascade="all"),
                                 cascade="all")})

        Session = sessionmaker(binds={User: self.metadata.bind,
                                      Address: self.metadata.bind})
        sess = Session()

        sess.execute(users.insert(), params=dict(id=1, name='ed'))
        eq_(sess.execute(users.select(users.c.id == 1)).fetchall(),
            [(1, 'ed')])

        eq_(sess.execute(users.select(User.id == 1)).fetchall(),
            [(1, 'ed')])

        sess.close()
Example #18
0
    def test_unidirectional_cascade_m2o(self):
        mapper(Order, orders, properties={"user": relation(User, backref=backref("orders", cascade=None))})
        mapper(User, users)

        sess = create_session()

        u1 = User()
        sess.add(u1)
        o1 = Order()
        o1.user = u1
        assert o1 not in sess
        assert u1 in sess

        sess.expunge_all()

        u1 = User()
        o1 = Order()
        o1.user = u1
        sess.add(u1)
        assert o1 not in sess
        assert u1 in sess
Example #19
0
 def test_unidirectional_cascade_o2m(self):
     mapper(Order, orders)
     mapper(User, users, properties = dict(
         orders = relation(
             Order, backref=backref("user", cascade=None))
     ))
     
     sess = create_session()
     
     o1 = Order()
     sess.add(o1)
     u1 = User(orders=[o1])
     assert u1 not in sess
     assert o1 in sess
     
     sess.clear()
     
     o1 = Order()
     u1 = User(orders=[o1])
     sess.add(o1)
     assert u1 not in sess
     assert o1 in sess
Example #20
0
    def test_unidirectional_cascade_m2o(self):
        mapper(Order, orders, properties={
            'user':relation(User, backref=backref("orders", cascade=None))
        })
        mapper(User, users)
        
        sess = create_session()
        
        u1 = User()
        sess.add(u1)
        o1 = Order()
        o1.user = u1
        assert o1 not in sess
        assert u1 in sess
        
        sess.clear()

        u1 = User()
        o1 = Order()
        o1.user = u1
        sess.add(u1)
        assert o1 not in sess
        assert u1 in sess
Example #21
0
    def test_expunge_cascade(self):
        mapper(Address, addresses)
        mapper(User, users, properties={
            'addresses':relation(Address,
                                 backref=backref("user", cascade="all"),
                                 cascade="all")})

        _fixtures.run_inserts_for(users)
        _fixtures.run_inserts_for(addresses)

        session = create_session()
        u = session.query(User).filter_by(id=7).one()

        # get everything to load in both directions
        print [a.user for a in u.addresses]

        # then see if expunge fails
        session.expunge(u)

        assert sa.orm.object_session(u) is None
        assert sa.orm.attributes.instance_state(u).session_id is None
        for a in u.addresses:
            assert sa.orm.object_session(a) is None
            assert sa.orm.attributes.instance_state(a).session_id is None
Example #22
0
    def testbasic(self):
        """Post_update only fires off when needed.

        This test case used to produce many superfluous update statements,
        particularly upon delete

        """

        mapper(Node,
               node,
               properties={
                   'children':
                   relation(Node,
                            primaryjoin=node.c.id == node.c.parent_id,
                            lazy=True,
                            cascade="all",
                            backref=backref("parent", remote_side=node.c.id)),
                   'prev_sibling':
                   relation(Node,
                            primaryjoin=node.c.prev_sibling_id == node.c.id,
                            remote_side=node.c.id,
                            lazy=True,
                            uselist=False),
                   'next_sibling':
                   relation(Node,
                            primaryjoin=node.c.next_sibling_id == node.c.id,
                            remote_side=node.c.id,
                            lazy=True,
                            uselist=False,
                            post_update=True)
               })

        session = create_session()

        def append_child(parent, child):
            if parent.children:
                parent.children[-1].next_sibling = child
                child.prev_sibling = parent.children[-1]
            parent.children.append(child)

        def remove_child(parent, child):
            child.parent = None
            node = child.next_sibling
            node.prev_sibling = child.prev_sibling
            child.prev_sibling.next_sibling = node
            session.delete(child)

        root = Node('root')

        about = Node('about')
        cats = Node('cats')
        stories = Node('stories')
        bruce = Node('bruce')

        append_child(root, about)
        assert (about.prev_sibling is None)
        append_child(root, cats)
        assert (cats.prev_sibling is about)
        assert (cats.next_sibling is None)
        assert (about.next_sibling is cats)
        assert (about.prev_sibling is None)
        append_child(root, stories)
        append_child(root, bruce)
        session.add(root)
        session.flush()

        remove_child(root, cats)
        # pre-trigger lazy loader on 'cats' to make the test easier
        cats.children
        self.assert_sql_execution(
            testing.db, session.flush,
            CompiledSQL(
                "UPDATE node SET prev_sibling_id=:prev_sibling_id "
                "WHERE node.id = :node_id", lambda ctx: {
                    'prev_sibling_id': about.id,
                    'node_id': stories.id
                }),
            CompiledSQL(
                "UPDATE node SET next_sibling_id=:next_sibling_id "
                "WHERE node.id = :node_id", lambda ctx: {
                    'next_sibling_id': stories.id,
                    'node_id': about.id
                }),
            CompiledSQL(
                "UPDATE node SET next_sibling_id=:next_sibling_id "
                "WHERE node.id = :node_id", lambda ctx: {
                    'next_sibling_id': None,
                    'node_id': cats.id
                }),
            CompiledSQL("DELETE FROM node WHERE node.id = :id",
                        lambda ctx: [{
                            'id': cats.id
                        }]))
Example #23
0
 def setup_mappers(self):
     mapper(T1, t1, properties=dict(t2=relation(T2, cascade="all, delete-orphan", single_parent=True)))
     mapper(
         T2,
         t2,
         properties=dict(
             t3=relation(T3, cascade="all, delete-orphan", single_parent=True, backref=backref("t2", uselist=False))
         ),
     )
     mapper(T3, t3)
Example #24
0
 def setup_mappers(self):
     mapper(TT, item, properties={
         'children': relation(
             TT,
             remote_side=[item.c.parent_uuid],
             backref=backref('parent', remote_side=[item.c.uuid]))})
Example #25
0
    def testbasic(self):
        """Post_update only fires off when needed.

        This test case used to produce many superfluous update statements,
        particularly upon delete

        """

        mapper(Node, node, properties={
            'children': relation(
                Node,
                primaryjoin=node.c.id==node.c.parent_id,
                lazy=True,
                cascade="all",
                backref=backref("parent", remote_side=node.c.id)
            ),
            'prev_sibling': relation(
                Node,
                primaryjoin=node.c.prev_sibling_id==node.c.id,
                remote_side=node.c.id,
                lazy=True,
                uselist=False),
            'next_sibling': relation(
                Node,
                primaryjoin=node.c.next_sibling_id==node.c.id,
                remote_side=node.c.id,
                lazy=True,
                uselist=False,
                post_update=True)})

        session = create_session()

        def append_child(parent, child):
            if parent.children:
                parent.children[-1].next_sibling = child
                child.prev_sibling = parent.children[-1]
            parent.children.append(child)

        def remove_child(parent, child):
            child.parent = None
            node = child.next_sibling
            node.prev_sibling = child.prev_sibling
            child.prev_sibling.next_sibling = node
            session.delete(child)
        root = Node('root')

        about = Node('about')
        cats = Node('cats')
        stories = Node('stories')
        bruce = Node('bruce')

        append_child(root, about)
        assert(about.prev_sibling is None)
        append_child(root, cats)
        assert(cats.prev_sibling is about)
        assert(cats.next_sibling is None)
        assert(about.next_sibling is cats)
        assert(about.prev_sibling is None)
        append_child(root, stories)
        append_child(root, bruce)
        session.add(root)
        session.flush()

        remove_child(root, cats)
        # pre-trigger lazy loader on 'cats' to make the test easier
        cats.children
        self.assert_sql_execution(
            testing.db, 
            session.flush,
            CompiledSQL("UPDATE node SET prev_sibling_id=:prev_sibling_id "
             "WHERE node.id = :node_id",
             lambda ctx:{'prev_sibling_id':about.id, 'node_id':stories.id}),

            CompiledSQL("UPDATE node SET next_sibling_id=:next_sibling_id "
             "WHERE node.id = :node_id",
             lambda ctx:{'next_sibling_id':stories.id, 'node_id':about.id}),

            CompiledSQL("UPDATE node SET next_sibling_id=:next_sibling_id "
             "WHERE node.id = :node_id",
             lambda ctx:{'next_sibling_id':None, 'node_id':cats.id}),
             
            CompiledSQL("DELETE FROM node WHERE node.id = :id",
             lambda ctx:[{'id':cats.id}])
        )