birden çok sütuna benzersiz sqlalchemy


174

Diyelim ki konumları temsil eden bir sınıfım var. Mekanlar müşterilere "aittir". Konumlar, bir unicode 10 karakter koduyla tanımlanır. "Konum kodu", belirli bir müşterinin konumları arasında benzersiz olmalıdır.

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

Yani iki müşterim varsa, müşteri "123" ve müşteri "456". Her ikisinin de "ana" adında bir konumu olabilir, ancak ikisinin de ana adında iki konumu olamaz.

Bunu iş mantığında halledebilirim ama sqlalchemy'deki gereksinimi kolayca eklemenin bir yolu olmadığından emin olmak istiyorum. Unique = True seçeneği yalnızca belirli bir alana uygulandığında çalışır ve tüm tablonun tüm konumlar için yalnızca benzersiz bir koda sahip olmasına neden olur.

Yanıtlar:


298

Alıntıdır belgelere ait Column:

unique - True olduğunda, bu sütunun benzersiz bir kısıtlama içerdiğini veya dizin de True ise , Dizin'in benzersiz bayrağıyla oluşturulması gerektiğini belirtir. Kısıtlamada / dizinde birden çok sütun belirtmek veya açık bir ad belirtmek için UniqueConstraint veya Index yapılarını açıkça kullanın.

Bunlar bir Tabloya ait olduğu ve eşlenmiş bir Sınıfa ait olmadığından, tablo tanımında bulunanları veya aşağıdakilerdeki gibi bildirim kullananları bildirir __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'),
                     )

Aynı problemle de karşılaşıyorum, ama UniqueConstraint kullanmak bana yardımcı olmadı. Index ('...') ile denedikten sonra benzersiz bir kısıtlama elde ederim. Bu davranışla ilgili bir açıklama var mı?
swdev

1
@swdev: hangi RDBMS'yi kullanıyorsunuz?
minibüs

3
Teşekkürler, ama sorum şuydu: DB şeması oluşturmak için SA (ve Flask) kullandınız mı veya ayrı mı oluşturdunuz?
Van

1
Neden .c. Kullanılmış?
Smiley

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
Olmalı __table_args__ = (db.UniqueConstraint('customer_id', 'location_code'),), sonunda virgül unutma.
bertdida
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.