添加到列表中的项目未按预期顺序排列
Added items to the list is not in expected ordered
联系人以1,2,3的顺序添加到列表中,但查询return显示列表是一个奇怪的顺序2,1,3。只有 follow 测试通过,注意 commit 前后的最后 3 行。
class Staff(mydb.Model):
__tablename__ = 'STAFF'
staff_id = mydb.Column(mydb.String(20), primary_key = True)
first_name = mydb.Column(mydb.String(64))
last_name = mydb.Column(mydb.String(64))
email = mydb.Column(mydb.String(62), unique=True, nullable = False)
password = mydb.Column(mydb.String(), nullable = False)
class StaffContact(mydb.Model):
__tablename__ = 'STAFF_CONTACT'
staff_id = mydb.Column(mydb.String(20), mydb.ForeignKey('STAFF.staff_id'), primary_key = True)
department = mydb.Column(mydb.String(50), primary_key = True)
office = mydb.Column(mydb.String(50))
phone = mydb.Column(mydb.String(15))
staff_obj = mydb.relationship('Staff', backref='contact_list')
def test_add_contact_to_new_staff(self):
staff = Staff(
staff_id='QWE',
first_name='QWE',
last_name='QWE',
email='QWE',
password='QWE')
mydb.session.add(staff)
mydb.session.commit()
staff_rst1 = mydb.session.query(Staff).filter_by(staff_id='QWE').first()
self.assertEquals(staff_rst1, staff)
self.assertIs(staff_rst1, staff)
contact_1 = StaffContact(
staff_id = 'XYZ',
department='XYZ',
office='XYZ',
phone='XYZ'
)
contact_2 = StaffContact(
staff_id = 'ABC',
department='ABC',
office='ABC',
phone='ABC'
)
contact_3 = StaffContact(
staff_id = 'EFG',
department='EFG',
office='EFG',
phone='EFG'
)
staff_rst1.contact_list=[contact_1, contact_2, contact_3]
mydb.session.add(staff_rst1)
self.assertIs(staff_rst1.contact_list[0], contact_1)
self.assertIs(staff_rst1.contact_list[1], contact_2)
self.assertIs(staff_rst1.contact_list[2], contact_3)
mydb.session.commit()
staff_rst2 = mydb.session.query(Staff).filter_by(staff_id='QWE').first()
self.assertIs(staff_rst2.contact_list[0], contact_2)
self.assertIs(staff_rst2.contact_list[1], contact_1)
self.assertIs(staff_rst2.contact_list[2], contact_3)
您的员工实例的数据库 returns 联系人按照最适合内部实现的顺序排列,而不是按照您将它们插入关系中的顺序排列。
您必须指定数据库应如何为您的联系人排序,然后使用 order_by
argument to relationship()
:
contact_list = relationship('StaffContact', order_by='StaffContact.id')
如果 contact_list
是反向引用,您可以在 backref()
object 上指定 order_by
:
from sqlalchemy.orm import backref
staff_obj = mydb.relationship(
'Staff', backref=backref('contact_list', order_by='StaffContact.id'))
这将按主 ID 对连接进行排序。如果需要维护无法从数据库中已包含的信息派生的特定订单,则必须向联系人添加 position
列并使用 ordering_list
object 来帮助维护该订单。
联系人以1,2,3的顺序添加到列表中,但查询return显示列表是一个奇怪的顺序2,1,3。只有 follow 测试通过,注意 commit 前后的最后 3 行。
class Staff(mydb.Model):
__tablename__ = 'STAFF'
staff_id = mydb.Column(mydb.String(20), primary_key = True)
first_name = mydb.Column(mydb.String(64))
last_name = mydb.Column(mydb.String(64))
email = mydb.Column(mydb.String(62), unique=True, nullable = False)
password = mydb.Column(mydb.String(), nullable = False)
class StaffContact(mydb.Model):
__tablename__ = 'STAFF_CONTACT'
staff_id = mydb.Column(mydb.String(20), mydb.ForeignKey('STAFF.staff_id'), primary_key = True)
department = mydb.Column(mydb.String(50), primary_key = True)
office = mydb.Column(mydb.String(50))
phone = mydb.Column(mydb.String(15))
staff_obj = mydb.relationship('Staff', backref='contact_list')
def test_add_contact_to_new_staff(self):
staff = Staff(
staff_id='QWE',
first_name='QWE',
last_name='QWE',
email='QWE',
password='QWE')
mydb.session.add(staff)
mydb.session.commit()
staff_rst1 = mydb.session.query(Staff).filter_by(staff_id='QWE').first()
self.assertEquals(staff_rst1, staff)
self.assertIs(staff_rst1, staff)
contact_1 = StaffContact(
staff_id = 'XYZ',
department='XYZ',
office='XYZ',
phone='XYZ'
)
contact_2 = StaffContact(
staff_id = 'ABC',
department='ABC',
office='ABC',
phone='ABC'
)
contact_3 = StaffContact(
staff_id = 'EFG',
department='EFG',
office='EFG',
phone='EFG'
)
staff_rst1.contact_list=[contact_1, contact_2, contact_3]
mydb.session.add(staff_rst1)
self.assertIs(staff_rst1.contact_list[0], contact_1)
self.assertIs(staff_rst1.contact_list[1], contact_2)
self.assertIs(staff_rst1.contact_list[2], contact_3)
mydb.session.commit()
staff_rst2 = mydb.session.query(Staff).filter_by(staff_id='QWE').first()
self.assertIs(staff_rst2.contact_list[0], contact_2)
self.assertIs(staff_rst2.contact_list[1], contact_1)
self.assertIs(staff_rst2.contact_list[2], contact_3)
您的员工实例的数据库 returns 联系人按照最适合内部实现的顺序排列,而不是按照您将它们插入关系中的顺序排列。
您必须指定数据库应如何为您的联系人排序,然后使用 order_by
argument to relationship()
:
contact_list = relationship('StaffContact', order_by='StaffContact.id')
如果 contact_list
是反向引用,您可以在 backref()
object 上指定 order_by
:
from sqlalchemy.orm import backref
staff_obj = mydb.relationship(
'Staff', backref=backref('contact_list', order_by='StaffContact.id'))
这将按主 ID 对连接进行排序。如果需要维护无法从数据库中已包含的信息派生的特定订单,则必须向联系人添加 position
列并使用 ordering_list
object 来帮助维护该订单。