Gino: JOIN does not work

Created on 12 Mar 2018  路  3Comments  路  Source: python-gino/gino

  • GINO version: 0.5.8
  • Python version: 3.6.3
  • Operating System: 4.13.0-36-generic GNU/Linux

Description

Hello! Thank you for GINO, it's great and very useful.

I've tried to execute a simple JOIN but failed.

What I Did

#! /usr/bin/env python
import asyncio
import gino

db = gino.Gino()

class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(80), nullable=False)


class Book(db.Model):
    __tablename__ = "books"
    __table_args__ = tuple([
        db.ForeignKeyConstraint(['user_id'], ['users.id']),
    ])  
    id = db.Column(db.Integer(), primary_key=True)
    user_id = db.Column(db.Integer(), nullable=False)
    name = db.Column(db.String(80), nullable=False)


async def test_join(db_url):
    db.bind = await db.create_pool(db_url)
    query = db.select(User).join(Book)
    print(query)
    result = await query.gino.all()


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(test_join("postgresql://[email protected]/test_join"))
    loop.close()

Output:

(SELECT users.id AS id, users.name AS name 
FROM users) JOIN books ON id = books.user_id
Traceback (most recent call last):
  File "./main.py", line 31, in <module>
    loop.run_until_complete(test_join("postgresql://[email protected]/test_join"))
  File "/usr/lib/python3.6/asyncio/base_events.py", line 467, in run_until_complete
    return future.result()
  File "./main.py", line 27, in test_join
    result = await query.gino.all()
AttributeError: 'Join' object has no attribute 'gino'

Please tell me how do I perform JOIN on these tables?

duplicate

Most helpful comment

Thanks! Please see #112 for more information. Simply change your query to this will do:

    query = User.join(Book).select()

Or if you need user values only:

    query = User.query.select_from(User.join(Book))

Or specifying columns:

```python
query = db.select([User.name, Book.name]).select_from(User.join(Book))
````

All 3 comments

Thanks! Please see #112 for more information. Simply change your query to this will do:

    query = User.join(Book).select()

Or if you need user values only:

    query = User.query.select_from(User.join(Book))

Or specifying columns:

```python
query = db.select([User.name, Book.name]).select_from(User.join(Book))
````

Thank you for rapid response. Despite you suggest solution different from the one from #112, it looks more beautiful and it works.

Yeah @brncsk's fixes in #113 get the credits.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

marcojulioarg picture marcojulioarg  路  3Comments

bnopne picture bnopne  路  5Comments

myraygunbarrel picture myraygunbarrel  路  3Comments

paulin-mipt picture paulin-mipt  路  4Comments

pmillssf picture pmillssf  路  3Comments