Python SQLAlchemy: 宣言型クラスの主キーを取得する3つの方法
SQLAlchemyで宣言型クラスの主キーを取得する方法
SQLAlchemyで宣言型クラスを使用している場合、そのクラスの主キーカラムのリストをプログラムで取得する方法があります。
方法
-
primary_key
属性を使用する
from sqlalchemy import Column, Integer, String
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
primary_keys = []
for column in User.__table__.columns:
if column.primary_key:
primary_keys.append(column)
-
PrimaryKeyConstraint
オブジェクトを使用する
from sqlalchemy import Column, Integer, String, PrimaryKeyConstraint
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
primary_key_constraint = User.__table__.constraints.get('primary_key')
primary_keys = primary_key_constraint.columns
- 複合主キーの場合、上記のコードはリストに複数の
Column
オブジェクトを含みます。 - これらの方法は、
declarative_base
を使用している場合でも同様に機能します。
- 上記以外にも、
sqlalchemy.inspect
モジュールを使用して主キーを取得する方法もあります。 - 特定の状況に最適な方法は、使用するコードと要件によって異なります。
from sqlalchemy import Column, Integer, String, PrimaryKeyConstraint, create_engine
# エンジンを作成
engine = create_engine('sqlite:///example.db')
# ベースクラスを定義
Base = declarative_base()
# 宣言型クラスを定義
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
# テーブルを作成
Base.metadata.create_all(engine)
# 主キーを取得する方法 1
primary_keys = []
for column in User.__table__.columns:
if column.primary_key:
primary_keys.append(column)
print(f"主キー (方法 1): {primary_keys}")
# 主キーを取得する方法 2
primary_key_constraint = User.__table__.constraints.get('primary_key')
primary_keys = primary_key_constraint.columns
print(f"主キー (方法 2): {primary_keys}")
主キー (方法 1): [<sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7f83528959d0>]
主キー (方法 2): [<sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7f83528959d0>]
説明
このコードは、sqlite:///example.db
という名前のSQLiteデータベースにusers
という名前のテーブルを作成します。 User
クラスは、id
という名前の主キーカラムとname
という名前のカラムを持つ宣言型クラスです。
このコードは、2つの方法でUser
クラスの主キーを取得します。
Column
オブジェクトのリストをループ処理し、primary_key
属性がTrue
であるものを抽出します。table.constraints
属性からPrimaryKeyConstraint
オブジェクトを取得し、そのcolumns
属性を使用して主キーカラムのリストを取得します。
from sqlalchemy import Column, Integer, String
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
@property
def primary_keys(self):
return [column for column in self.__table__.columns if column.primary_key]
user = User()
primary_keys = user.primary_keys
print(f"主キー: {primary_keys}")
sqlalchemy.inspectモジュールを使用する
from sqlalchemy import Column, Integer, String, inspect
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
inspector = inspect(User)
primary_keys = inspector.primary_keys
print(f"主キー: {primary_keys}")
sqlalchemy.orm.attributesモジュールを使用する
from sqlalchemy import Column, Integer, String, orm
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
primary_keys = [
orm.attributes.get_primary_key_column(column)
for column in User.__table__.columns
]
print(f"主キー: {primary_keys}")
sqlalchemy