Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 生成的查询是否包含冗余产品?_Python_Sqlalchemy - Fatal编程技术网

Python 生成的查询是否包含冗余产品?

Python 生成的查询是否包含冗余产品?,python,sqlalchemy,Python,Sqlalchemy,我有这样一些简单的模型: TableA2TableB = Table('TableA2TableB', Base.metadata, Column('tablea_id', BigInteger, ForeignKey('TableA.id')), Column('tableb_id', Integer, ForeignKey('TableB.id'))) class TableA(Base):

我有这样一些简单的模型:

TableA2TableB = Table('TableA2TableB', Base.metadata,
                        Column('tablea_id', BigInteger, ForeignKey('TableA.id')),
                        Column('tableb_id', Integer, ForeignKey('TableB.id')))


class TableA(Base):
    __tablename__ = 'TableA'
    id = Column(BigInteger, primary_key=True)
    infohash = Column(String, unique=True)
    url = Column(String)
    tablebs = relationship('TableB', secondary=TableA2TableB, backref='tableas')


class TableB(Base):
    __tablename__ = 'TableB'
    id = Column(Integer, primary_key=True)
    url = Column(String, unique=True)
但是,sqla生成如下查询

SELECT "TableB".id, "TableB".url AS "TableB_url" FROM "TableB", "TableA2TableB" 
WHERE "TableA2TableB".tableb_id = "TableB".id AND "TableA2TableB".tablea_id = 408997;
但是,当选择的属性是表B中的属性时,为什么查询中会有笛卡尔积呢<代码>表A2tableB不需要


感谢现在的情况,TableB(tableas)中有一个backref关系,它被加载是因为默认加载模式被设置为select

您可能需要将table a.tables更改为

tablebs = relationship('TableB', secondary=TableA2TableB, backref='tableas', lazy="dynamic")

但是,即使没有
lazy=“dynamic”
,当只选择
“TableB”.id
“TableB”.url
时,backref如何加载?没有从
TableA2TableB
收集任何内容。您发布的查询似乎来自session.query(TableB.filter)(TableB.tableas.id==408997),因此必须以某种方式引用它。通过指定lazy=“dynamic”并执行诸如session.query(TableB.filter)(TableB.id==xxxxx)之类的操作,您将不会在查询中使用第二个表