Python 无法使一对多关系在(烧瓶-)SQLAlchemy中工作

Python 无法使一对多关系在(烧瓶-)SQLAlchemy中工作,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,我有几门课: import uuid from app import db, create_app from sqlalchemy.sql import func from sqlalchemy.dialects.postgresql import UUID, ARRAY, JSONB class Ticket(db.Model): __tablename__ = 'tickets' id = db.Column(UUID(as_uuid=True), primary_key=

我有几门课:

import uuid
from app import db, create_app
from sqlalchemy.sql import func
from sqlalchemy.dialects.postgresql import UUID, ARRAY, JSONB

class Ticket(db.Model):
    __tablename__ = 'tickets'
    id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    time = db.Column(db.DateTime, server_default=func.now(), index=True)
    proposed_names = db.Column(ARRAY(db.String))
    measurements = db.relationship('TempMeasurement', back_populates='ticket')

class BaseMeasurement(object):
    id = db.Column(db.Integer, primary_key=True)

    @declared_attr
    def type_id(self):
        return db.Column(db.Integer, db.ForeignKey('optical_data_types.id'))

    @declared_attr
    def type(self):
        return db.relationship('OpticalDataType')

    @declared_attr
    def operator_id(self):
        return db.Column(db.Integer, db.ForeignKey('operators.id'))

    @declared_attr
    def operator(self):
        return db.relationship('Operator')

    @declared_attr
    def item_id(self):
        return db.Column(db.String, db.ForeignKey('items.serial'))

    @declared_attr
    def item(self):
        return db.relationship('Item')

    time = db.Column(db.DateTime, index=True)
    instrument = db.Column(db.String)
    instrument_sn = db.Column(db.String)
    data = db.Column(JSONB)

class TempMeasurement(db.Model, BaseMeasurement):
    __tablename__ = 'ticket_data'
    id = db.Column(db.Integer, primary_key=True)
    ticket_id = db.Column(UUID(as_uuid=True), db.ForeignKey('tickets.id'), index=True)
    ticket = db.relationship('Ticket', back_populates='measurements')
    original_paths = db.Column(ARRAY(db.String))
我想要/期望的是,我可以创建一个带有多个子
tempeasurements
Ticket
,并将其提交到数据库。比如:

app = create_app()

with app.app_context():
    ticket = Ticket()
    ticket.measurements = [TempMeasurement(...)]
    db.session.add(ticket)   # <-- error on this line
    db.session.commit()
有完整的痕迹

我认为这可能是因为
UUID
ticket\u id列有as\u UUID,所以我将其简化为UUID(隐式地是
str
),但这并没有解决我的问题


SQLAlchemy中的错误太深,我无法理解——有人能帮忙吗?

什么是
db.session
?我希望您在使用会话时必须打开和关闭会话,而不是在全局变量中有一个已打开的会话。。。e、 g.
Session=sessionmaker(bind=db\u引擎);session=session()
然后才使用它。
db.session
是一个由
SQLAlchemy
管理的全局会话--使用该扩展,您不需要手动管理会话创建和销毁,或引擎绑定。我只是在这里猜测一下,但它可能有助于首先添加
票证,甚至在此之后,然后添加
测量值
?如果我
添加并刷新
票据,则执行
ticket.measurements=[…];db.session.add(ticket)
,我得到了相同的错误。这似乎是我的关系中的某种配置错误。如果省略这一行
ticket.measurements=[tempeasurement(…)]
是否有效?
AttributeError: 'str' object has no attribute '_sa_instance_state'