Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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 can';t在sqlalchemy中插入一对多关系_Python_Sqlalchemy - Fatal编程技术网

Python can';t在sqlalchemy中插入一对多关系

Python can';t在sqlalchemy中插入一对多关系,python,sqlalchemy,Python,Sqlalchemy,我在sqlalchemy中有一对多的关系,但是我没有让插入正常工作。我试着在这里举一个简单的例子: from sqlalchemy import * from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship, sessionmaker db = create_engine('sqlite://') db.echo = True metadata = MetaD

我在sqlalchemy中有一对多的关系,但是我没有让插入正常工作。我试着在这里举一个简单的例子:

from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker

db = create_engine('sqlite://')
db.echo = True

metadata = MetaData(db)
Base = declarative_base()
Session = sessionmaker(bind=db)
session = Session()

class Child(Base):
    __table__ = Table('child', Base.metadata,
        Column('id', Integer, primary_key=True),
        Column('parent_id', Integer),
        Column('name', String(50))
    )

class Parent(Base):
    __table__ = Table('parent', Base.metadata,
        Column('id', Integer, primary_key=True),
        Column('name', String(50))
    )

    children = relationship(Child, primaryjoin="Parent.id == Child.parent_id",
                            foreign_keys=[__table__.c.id])



Base.metadata.create_all(db)

c = Child(id=1, name="C")
p = Parent(id=1, name="P", children=[c])
session.add(p)
session.commit()
运行此命令将从
session.add(p)
中得到
AttributeError:'list'对象没有属性'\u sa\u instance\u state'

我尝试将课程改为:

class Child(Base):
    __tablename__ = 'child'

    id = Column('id', Integer, primary_key=True)
    parent_id = Column('parent_id', Integer, ForeignKey('parent.id'))
    name = Column('name', String(50))

class Parent(Base):
    __tablename__ = 'parent'

    id = Column('id', Integer, primary_key=True)
    name = Column('name', String(50))

    children = relationship(Child, backref="parent")

然后它就起作用了。我在这里指定parent_id是一个外键,并使用backref语法。然而,在我的生产代码中,父表是一个临时表,所以我不能使用ForeignKey直接引用它。那么,第一个代码块有什么问题,如何修复它呢?

来自SQLAlchemy
关系中的API:

也就是说,如果此关系()的primaryjoin条件是a.id==b.a_id,并且b.a_id中的值必须存在于a.id中,那么此关系()的“外键”列就是b.a_id

在您的示例中,
child.parent\u id
必须出现在
parent.id
中。因此,您的“外键”列是
child.parent\u id

因此,改变:

foreign_keys=[__table__.c.id]
为此:

foreign_keys=[Child.__table__.c.parent_id]
应该能解决你的问题