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

📄 query.py

📁 SQLAlchemy. 经典的Python ORM框架。学习必看。
💻 PY
📖 第 1 页 / 共 4 页
字号:
        q = q.add_entity(Order, id='order1').add_entity(Item, id='item1')        assert q.count() == 1        assert [(User(id=7), Order(description='order 3'), Item(description='item 1'))] == q.all()        q = sess.query(User).add_entity(Order).join('orders', aliased=True).filter(Order.description=="order 3").join('orders', aliased=True).filter(Order.description=='order 4')        try:            q.compile()            assert False        except exceptions.InvalidRequestError, e:            assert str(e) == "Ambiguous join for entity 'Mapper|Order|orders'; specify id=<someid> to query.join()/query.add_entity()"class MultiplePathTest(ORMTest):    def define_tables(self, metadata):        global t1, t2, t1t2_1, t1t2_2        t1 = Table('t1', metadata,            Column('id', Integer, primary_key=True),            Column('data', String(30))            )        t2 = Table('t2', metadata,            Column('id', Integer, primary_key=True),            Column('data', String(30))            )        t1t2_1 = Table('t1t2_1', metadata,            Column('t1id', Integer, ForeignKey('t1.id')),            Column('t2id', Integer, ForeignKey('t2.id'))            )        t1t2_2 = Table('t1t2_2', metadata,            Column('t1id', Integer, ForeignKey('t1.id')),            Column('t2id', Integer, ForeignKey('t2.id'))            )    def test_basic(self):        class T1(object):pass        class T2(object):pass        mapper(T1, t1, properties={            't2s_1':relation(T2, secondary=t1t2_1),            't2s_2':relation(T2, secondary=t1t2_2),        })        mapper(T2, t2)        try:            create_session().query(T1).join('t2s_1').filter(t2.c.id==5).reset_joinpoint().join('t2s_2')            assert False        except exceptions.InvalidRequestError, e:            assert str(e) == "Can't join to property 't2s_2'; a path to this table along a different secondary table already exists.  Use the `alias=True` argument to `join()`."        create_session().query(T1).join('t2s_1', aliased=True).filter(t2.c.id==5).reset_joinpoint().join('t2s_2').all()        create_session().query(T1).join('t2s_1').filter(t2.c.id==5).reset_joinpoint().join('t2s_2', aliased=True).all()class SynonymTest(QueryTest):    keep_mappers = True    keep_data = True    def setup_mappers(self):        mapper(User, users, properties={            'name_syn':synonym('name'),            'addresses':relation(Address),            'orders':relation(Order, backref='user'), # o2m, m2o            'orders_syn':synonym('orders')        })        mapper(Address, addresses)        mapper(Order, orders, properties={            'items':relation(Item, secondary=order_items),  #m2m            'address':relation(Address),  # m2o            'items_syn':synonym('items')        })        mapper(Item, items, properties={            'keywords':relation(Keyword, secondary=item_keywords) #m2m        })        mapper(Keyword, keywords)    def test_joins(self):        for j in (            ['orders', 'items'],            ['orders_syn', 'items'],            ['orders', 'items_syn'],            ['orders_syn', 'items_syn'],        ):            result = create_session().query(User).join(j).filter_by(id=3).all()            assert [User(id=7, name='jack'), User(id=9, name='fred')] == result    def test_with_parent(self):        for nameprop, orderprop in (            ('name', 'orders'),            ('name_syn', 'orders'),            ('name', 'orders_syn'),            ('name_syn', 'orders_syn'),        ):            sess = create_session()            q = sess.query(User)            u1 = q.filter_by(**{nameprop:'jack'}).one()            o = sess.query(Order).with_parent(u1, property=orderprop).all()            assert [Order(description="order 1"), Order(description="order 3"), Order(description="order 5")] == oclass InstancesTest(QueryTest):    def test_from_alias(self):        query = users.select(users.c.id==7).union(users.select(users.c.id>7)).alias('ulist').outerjoin(addresses).select(use_labels=True,order_by=['ulist.id', addresses.c.id])        sess =create_session()        q = sess.query(User)        def go():            l = q.options(contains_alias('ulist'), contains_eager('addresses')).instances(query.execute())            assert fixtures.user_address_result == l        self.assert_sql_count(testing.db, go, 1)        sess.clear()        def go():            l = q.options(contains_alias('ulist'), contains_eager('addresses')).from_statement(query).all()            assert fixtures.user_address_result == l        self.assert_sql_count(testing.db, go, 1)    def test_contains_eager(self):        selectquery = users.outerjoin(addresses).select(users.c.id<10, use_labels=True, order_by=[users.c.id, addresses.c.id])        sess = create_session()        q = sess.query(User)        def go():            l = q.options(contains_eager('addresses')).instances(selectquery.execute())            assert fixtures.user_address_result[0:3] == l        self.assert_sql_count(testing.db, go, 1)        sess.clear()        def go():            l = q.options(contains_eager('addresses')).from_statement(selectquery).all()            assert fixtures.user_address_result[0:3] == l        self.assert_sql_count(testing.db, go, 1)    def test_contains_eager_alias(self):        adalias = addresses.alias('adalias')        selectquery = users.outerjoin(adalias).select(use_labels=True, order_by=[users.c.id, adalias.c.id])        sess = create_session()        q = sess.query(User)        def go():            # test using a string alias name            l = q.options(contains_eager('addresses', alias="adalias")).instances(selectquery.execute())            assert fixtures.user_address_result == l        self.assert_sql_count(testing.db, go, 1)        sess.clear()        def go():            # test using the Alias object itself            l = q.options(contains_eager('addresses', alias=adalias)).instances(selectquery.execute())            assert fixtures.user_address_result == l        self.assert_sql_count(testing.db, go, 1)        sess.clear()        def decorate(row):            d = {}            for c in addresses.columns:                d[c] = row[adalias.corresponding_column(c)]            return d        def go():            # test using a custom 'decorate' function            l = q.options(contains_eager('addresses', decorator=decorate)).instances(selectquery.execute())            assert fixtures.user_address_result == l        self.assert_sql_count(testing.db, go, 1)        sess.clear()        oalias = orders.alias('o1')        ialias = items.alias('i1')        query = users.outerjoin(oalias).outerjoin(order_items).outerjoin(ialias).select(use_labels=True).order_by(users.c.id).order_by(oalias.c.id).order_by(ialias.c.id)        q = create_session().query(User)        # test using string alias with more than one level deep        def go():            l = q.options(contains_eager('orders', alias='o1'), contains_eager('orders.items', alias='i1')).instances(query.execute())            assert fixtures.user_order_result == l        self.assert_sql_count(testing.db, go, 1)        sess.clear()        # test using Alias with more than one level deep        def go():            l = q.options(contains_eager('orders', alias=oalias), contains_eager('orders.items', alias=ialias)).instances(query.execute())            assert fixtures.user_order_result == l        self.assert_sql_count(testing.db, go, 1)        sess.clear()    def test_multi_mappers(self):        test_session = create_session()        (user7, user8, user9, user10) = test_session.query(User).all()        (address1, address2, address3, address4, address5) = test_session.query(Address).all()        # note the result is a cartesian product        expected = [(user7, address1),            (user8, address2),            (user8, address3),            (user8, address4),            (user9, address5),            (user10, None)]        sess = create_session()        selectquery = users.outerjoin(addresses).select(use_labels=True, order_by=[users.c.id, addresses.c.id])        q = sess.query(User)        l = q.instances(selectquery.execute(), Address)        assert l == expected        sess.clear()        for aliased in (False, True):            q = sess.query(User)            q = q.add_entity(Address).outerjoin('addresses', aliased=aliased)            l = q.all()            assert l == expected            sess.clear()            q = sess.query(User).add_entity(Address)            l = q.join('addresses', aliased=aliased).filter_by(email_address='ed@bettyboop.com').all()            assert l == [(user8, address3)]            sess.clear()            q = sess.query(User, Address).join('addresses', aliased=aliased).filter_by(email_address='ed@bettyboop.com')            assert q.all() == [(user8, address3)]            sess.clear()            q = sess.query(User, Address).join('addresses', aliased=aliased).options(eagerload('addresses')).filter_by(email_address='ed@bettyboop.com')            assert q.all() == [(user8, address3)]            sess.clear()    def test_aliased_multi_mappers(self):        sess = create_session()        (user7, user8, user9, user10) = sess.query(User).all()        (address1, address2, address3, address4, address5) = sess.query(Address).all()        # note the result is a cartesian product        expected = [(user7, address1),            (user8, address2),            (user8, address3),            (user8, address4),            (user9, address5),            (user10, None)]        q = sess.query(User)        adalias = addresses.alias('adalias')        q = q.add_entity(Address, alias=adalias).select_from(users.outerjoin(adalias))        l = q.all()        assert l == expected        sess.clear()        q = sess.query(User).add_entity(Address, alias=adalias)        l = q.select_from(users.outerjoin(adalias)).filter(adalias.c.email_address=='ed@bettyboop.com').all()        assert l == [(user8, address3)]    def test_multi_columns(self):        sess = create_session()        expected = [(u, u.name) for u in sess.query(User).all()]        for add_col in (User.name, users.c.name, User.c.name):            assert sess.query(User).add_column(add_col).all() == expected            sess.clear()        try:            sess.query(User).add_column(object()).all()            assert False        except exceptions.InvalidRequestError, e:            assert "Invalid column expression" in str(e)    def test_multi_columns_2(self):        """test aliased/nonalised joins with the usage of add_column()"""        sess = create_session()        (user7, user8, user9, user10) = sess.query(User).all()        expected = [(user7, 1),            (user8, 3),            (user9, 1),            (user10, 0)            ]        for aliased in (False, True):            q = sess.query(User)            q = q.group_by([c for c in users.c]).order_by(User.id).outerjoin('addresses', aliased=aliased).add_column(func.count(Address.id).label('count'))            l = q.all()            assert l == expected            sess.clear()        s = select([users, func.count(addresses.c.id).label('count')]).select_from(users.outerjoin(addresses)).group_by(*[c for c in users.c]).order_by(User.id)        q = sess.query(User)        l = q.add_column("count").from_statement(s).all()        assert l == expected    def test_two_columns(self):        sess = create_session()        (user7, user8, user9, user10) = sess.query(User).all()        expected = [            (user7, 1, "Name:jack"),            (user8, 3, "Name:ed"),            (user9, 1, "Name:fred"),

⌨️ 快捷键说明

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