`PrimaryKeyConstraint` クラスを使用する
SQLAlchemyで複数カラム主キーを持つテーブルクラスを宣言する方法
SQLAlchemyで複数のカラムを持つ主キーを持つテーブルクラスを宣言するには、いくつかの方法があります。
方法1: __table_args__
属性を使用する
この方法は、最も一般的で、シンプルです。
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
email = Column(String(120), unique=True)
addresses = relationship("Address", back_populates="user")
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'))
street = Column(String(50))
city = Column(String(50))
user = relationship("User", back_populates="addresses")
# 複数カラム主キーを設定
User.__table_args__ = (
PrimaryKeyConstraint('id', 'email'),
)
この例では、User
テーブルには id
と email
という2つのカラムを持つ主キーがあります。
方法2: PrimaryKeyConstraint
クラスを使用する
この方法は、より詳細な設定が可能です。
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base, PrimaryKeyConstraint
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
email = Column(String(120), unique=True)
addresses = relationship("Address", back_populates="user")
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'))
street = Column(String(50))
city = Column(String(50))
user = relationship("User", back_populates="addresses")
# 複数カラム主キーを設定
User.__table_args__ = (
PrimaryKeyConstraint('id', 'email', name='user_pk'),
)
この例では、User
テーブルの主キーに user_pk
という名前を設定しています。
方法3: CompositeKey
クラスを使用する
この方法は、より複雑な主キーを設定する場合に便利です。
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base, CompositeKey
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
email = Column(String(120), unique=True)
addresses = relationship("Address", back_populates="user")
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'))
street = Column(String(50))
city = Column(String(50))
user = relationship("User", back_populates="addresses")
# 複数カラム主キーを設定
User.__table_args__ = (
CompositeKey('id', 'email'),
)
この例では、User
テーブルの主キーを id
と email
の複合キーとして設定しています。
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base, PrimaryKeyConstraint, CompositeKey
Base = declarative_base()
# 方法1
class User1(Base):
__tablename__ = 'users1'
id = Column(Integer, primary_key=True)
name = Column(String(50))
email = Column(String(120), unique=True)
addresses = relationship("Address1", back_populates="user")
class Address1(Base):
__tablename__ = 'addresses1'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users1.id'))
street = Column(String(50))
city = Column(String(50))
user = relationship("User1", back_populates="addresses")
# 複数カラム主キーを設定
User1.__table_args__ = (
PrimaryKeyConstraint('id', 'email'),
)
# 方法2
class User2(Base):
__tablename__ = 'users2'
id = Column(Integer, primary_key=True)
name = Column(String(50))
email = Column(String(120), unique=True)
addresses = relationship("Address2", back_populates="user")
class Address2(Base):
__tablename__ = 'addresses2'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users2.id'))
street = Column(String(50))
city = Column(String(50))
user = relationship("User2", back_populates="addresses")
# 複数カラム主キーを設定
User2.__table_args__ = (
PrimaryKeyConstraint('id', 'email', name='user_pk'),
)
# 方法3
class User3(Base):
__tablename__ = 'users3'
id = Column(Integer, primary_key=True)
name = Column(String(50))
email = Column(String(120), unique=True)
addresses = relationship("Address3", back_populates="user")
class Address3(Base):
__tablename__ = 'addresses3'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users3.id'))
street = Column(String(50))
city = Column(String(50))
user = relationship("User3", back_populates="addresses")
# 複数カラム主キーを設定
User3.__table_args__ = (
CompositeKey('id', 'email'),
)
このコードを実行すると、3つのテーブル (users1
, users2
, users3
) が作成されます。
users3
テーブルは、方法3で定義されています。
実行方法
このコードを実行するには、以下の手順が必要です。
- PythonとSQLAlchemyをインストールします。
- コードを保存します。
python sample.py
出力
Creating tables...
Done!
Column オブジェクトに primary_key オプションを使用する
from sqlalchemy import Column, Integer, String
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
email = Column(String(120), primary_key=True)
from sqlalchemy import Column, Integer, String, ForeignKey
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id', primary_key=True))
この例では、Address
テーブルの user_id
カラムを User
テーブルの id
カラムを参照する外部キーとして設定しています。また、user_id
カラムを主キーとしても設定しています。
UniqueConstraint オブジェクトを使用する
from sqlalchemy import Column, Integer, String, UniqueConstraint
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
email = Column(String(120), unique=True)
__table_args__ = (
UniqueConstraint('id', 'email'),
)
これらの方法は、上記で説明した3つの方法よりも簡潔ですが、機能的には同じです。
sqlalchemy