sqlalchemy ไม่ซ้ำกันในหลายคอลัมน์


174

สมมติว่าฉันมีชั้นเรียนที่แสดงถึงสถานที่ สถานที่ "เป็น" สำหรับลูกค้า สถานที่จะถูกระบุด้วยรหัสอักขระ 10 ยูนิโค้ด "รหัสสถานที่" ควรไม่ซ้ำกันในสถานที่สำหรับลูกค้าที่เฉพาะเจาะจง

The two below fields in combination should be unique
customer_id = Column(Integer,ForeignKey('customers.customer_id')
location_code = Column(Unicode(10))

ดังนั้นถ้าฉันมีลูกค้าสองคนลูกค้า "123" และลูกค้า "456" พวกเขาทั้งสองสามารถมีตำแหน่งที่เรียกว่า "main" แต่ไม่สามารถมีสองตำแหน่งที่เรียกว่า main

ฉันสามารถจัดการกับเรื่องนี้ในตรรกะทางธุรกิจ แต่ฉันต้องการให้แน่ใจว่าไม่มีวิธีที่จะเพิ่มความต้องการใน sqlalchemy ได้อย่างง่ายดาย ดูเหมือนว่าตัวเลือกที่ไม่ซ้ำกัน = True จะทำงานเฉพาะเมื่อนำไปใช้กับเขตข้อมูลที่เฉพาะเจาะจงและมันจะทำให้ทั้งตารางมีรหัสที่ไม่ซ้ำกันสำหรับทุกสถานที่

คำตอบ:


298

แยกจากเอกสารของColumn:

ที่ไม่ซ้ำกัน - เมื่อเป็น True ระบุว่าคอลัมน์นี้มีข้อ จำกัด ที่ไม่ซ้ำกันหรือถ้าดัชนีเป็นจริงเช่นกันแสดงว่าดัชนีควรสร้างด้วยค่าสถานะที่ไม่ซ้ำกัน หากต้องการระบุหลายคอลัมน์ในข้อ จำกัด / ดัชนีหรือเพื่อระบุชื่อที่ชัดเจนให้ใช้โครงสร้าง UniqueConstraintหรือดัชนีอย่างชัดเจน

เนื่องจากสิ่งเหล่านี้เป็นของตารางและไม่ใช่คลาสที่แม็พหนึ่งประกาศในนิยามของตารางหรือถ้าใช้การประกาศใน__table_args__:

# version1: table definition
mytable = Table('mytable', meta,
    # ...
    Column('customer_id', Integer, ForeignKey('customers.customer_id')),
    Column('location_code', Unicode(10)),

    UniqueConstraint('customer_id', 'location_code', name='uix_1')
    )
# or the index, which will ensure uniqueness as well
Index('myindex', mytable.c.customer_id, mytable.c.location_code, unique=True)


# version2: declarative
class Location(Base):
    __tablename__ = 'locations'
    id = Column(Integer, primary_key = True)
    customer_id = Column(Integer, ForeignKey('customers.customer_id'), nullable=False)
    location_code = Column(Unicode(10), nullable=False)
    __table_args__ = (UniqueConstraint('customer_id', 'location_code', name='_customer_location_uc'),
                     )

ฉันประสบปัญหาเดียวกันเช่นกัน แต่การใช้ UniqueConstraint ไม่ได้ช่วยฉัน หลังจากที่ฉันลองกับดัชนี ('... ') แล้วฉันจะได้รับข้อ จำกัด ที่ไม่ซ้ำ มีคำอธิบายเกี่ยวกับพฤติกรรมนี้หรือไม่?
swdev

1
@swdev: คุณใช้ RDBMS ใด
รถตู้

3
ขอบคุณ แต่คำถามของฉันคือ: คุณใช้ SA (และ Flask) เพื่อสร้าง DB schema หรือสร้างแยกต่างหากหรือไม่
รถตู้

1
ทำไมเป็น. c ใช้?
ยิ้ม

1
@Smiley .c.เป็นทางลัดไป.columns.
van

7
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

class Location(Base):
      __table_args__ = (
        # this can be db.PrimaryKeyConstraint if you want it to be a primary key
        db.UniqueConstraint('customer_id', 'location_code'))
      customer_id = Column(Integer,ForeignKey('customers.customer_id')
      location_code = Column(Unicode(10))

1
ต้อง__table_args__ = (db.UniqueConstraint('customer_id', 'location_code'),)อย่าลืมเครื่องหมายจุลภาคในตอนท้าย
bertdida
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.