【问题标题】:(Beginner) SQLAlchemy JOIN with SQLITE(初级) SQLAlchemy JOIN 与 SQLITE
【发布时间】:2020-06-25 23:40:55
【问题描述】:

我正在学习 sqlalchemy,我无法理解这个错误的原因。

from sqlalchemy import create_engine, Table, Column, MetaData, INTEGER, String, ForeignKey, ForeignKeyConstraint
from sqlalchemy.sql import Select

engine = create_engine('sqlite:///:memory:')

with engine.connect() as conn:
    meta = MetaData(engine)

    cars = Table('Cars', meta,
                 Column('Id', INTEGER, primary_key=True, autoincrement=True),
                 Column('Name', String, nullable=False),
                 Column('BrandId', INTEGER, ForeignKey('Brands.Id')))


    brands = Table('Brands', meta,
                  Column('Id', INTEGER, primary_key=True, autoincrement=True),
                  Column('Name', String))

    meta.create_all()

    cars_values = [{'Name':'Escort', 'BrandId':1}]
    brands_values = [{'Id':1, 'Name': 'Ford'}]

    insert1 = brands.insert().values(brands_values)
    insert2 = cars.insert().values(cars_values)
    conn.execute(insert1)
    conn.execute(insert2)

    query = Select([cars]).join(brands, brands.c.Id == cars.c.BrandId)
    #query = 'select * from cars c JOIN brands b on b.id = c.brandid'
    result = conn.execute(query)

    print(result.fetchall())

当我以这种方式运行时,我得到一个错误

Select([cars]).join(brands, brands.c.Id == cars.c.BrandId)
sqlalchemy.exc.ObjectNotExecutableError: Not an executable object: <sqlalchemy.sql.selectable.Join at 0x1e62654ed88; Join object on Select object(2087997204936) and Brands(2087997203848)>

但如果您运行原始 sql,则接受 JOIN

'select * from cars c JOIN brands b on b.id = c.brandid'
[(1, 'Escort', 1, 1, 'Ford')]

【问题讨论】:

  • 在考虑发布之前,请阅读手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com &标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。

标签: python sqlite join sqlalchemy


【解决方案1】:
query = select(['*']).select_from(cars.join(brands, brands.c.Id == cars.c.BrandId))
# print(query)                                                                                                                                                                                                                                                                     
# SELECT * FROM "Cars" JOIN "Brands" ON "Brands"."Id" = "Cars"."BrandId"

Using Joins

【讨论】:

  • 由于Cars.BrandId 被定义为ForeignKeyjoin 的第二个参数是多余的。你可以使用query = select(['*']).select_from(cars.join(brands))
【解决方案2】:

这是另一种方式

从 sqlalchemy 导入文本

query = text("select c.Id, c.Name,c.BrandId, b.Id, b.Name from Cars c left join
b.Id 上的品牌 b = b.Id ")

结果 = engine.execute(查询)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 2019-11-12
    • 1970-01-01
    • 2020-01-03
    • 2011-11-25
    • 1970-01-01
    • 2018-08-08
    相关资源
    最近更新 更多