sqlalchemy.orm.exc.FlushError:实例具有 NULL 身份键

wik*_*iko 4 python mysql sqlalchemy

我打算使用 Python27 中的 sqlalchemy 将数据提交到 mysql 表。当我尝试运行此文件时,它显示这样的错误

sqlalchemy.orm.exc.FlushError: Instance <TravelScheduleDetailRepository at 0x7f0fc07c8950> has a NULL identity key.  If this is an auto-generated value, check that the database table allows generation of new primary key values, and that the mapped Column object is configured to expect these generated values.  Ensure also that this flush() is not occurring at an inappropriate time, such aswithin a load() event.
Run Code Online (Sandbox Code Playgroud)

之后它成功地在 mysql 表上创建了一个新行,尽管所有列都为空

这是我的课

class TravelScheduleDetailRepository(Base):
    __tablename__ = 'Schedule_Detail'
    schedule_id = Column(String(7), primary_key = True)
    transport_id = Column(String(5))
    transport_type = Column(String(80))
    transport_company_name = Column(String(80))
    departure_city_id = Column(String(3))
    departure_country_id = Column(String(3))
    destination_city_id = Column(String(3))
    destination_country_id = Column(String(3))
    departure_date = Column(DateTime)
    available_seat = Column(Integer, autoincrement=False)

    def __init__(self, schedule_id, transport_id, transport_type, transport_company_name, departure_city_id, departure_country_id, destination_city_id, destination_country_id, departure_date, available_seat):
            self.schedule_id
            self.transport_id
            self.transport_type
            self.transport_company_name
            self.departure_city_id
            self.departure_country_id
            self.destination_city_id
            self.destination_country_id
            self.departure_date
            self.available_seat

    def __repr__(self):
            return "<TravelScheduleDetailRepository(schedule_id='%s', transport_id='%s', transport_type='%s', transport_company_name='%s', departure_city_id='%s', departure_country_id='%s', destination_city_id='%s', destination_country_id = '%s', departure_date = '%d', available_seat='%i')>" % ( self.schedule_id, self.transport_id, self.transport_type, self.transport_company_name, self.departure_city_id, self.departure_country_id, self.destination_city_id, self.destination_country_id, self.departure_date, self.available_seat)
Run Code Online (Sandbox Code Playgroud)

这是我将其插入 mysql 的方法

    Session = sessionmaker(bind=engine)
session = Session()
newSchedule = TravelScheduleDetailRepository(schedule_id='bbb', transport_id='33', transport_type='Hell', transport_company_name='Slick', departure_city_id='GGG', departure_country_id='FOO', destination_city_id='WWW', destination_country_id='FFF', departure_date='03-03-2011', available_seat=40)
session.add(newSchedule)
session.flush()
session.commit()
Run Code Online (Sandbox Code Playgroud)

谢谢

van*_*van 5

您的__init__方法不完整:为了将参数分配给成员变量,您实际上应该assign

def __init__(...):
    self.schedule_id = schedule_id
    ...
Run Code Online (Sandbox Code Playgroud)

你可以在调用之前调用flush,只需调用print(newSchedule),你就会看到你的所有字段都是空的。