web-dev-qa-db-ja.com

SQLAlchemyの結果から列名を取得する方法(宣言構文)

私はピラミッドプロジェクトで働いており、宣言構文のSQLAlchemyのテーブルを持っています

"""models.py"""
class Projects(Base):
    __tablename__ = 'projects'
    __table_args__ = {'autoload': True}

を使用して結果を取得します

""""views.py"""
session = DBSession()
row_data = session.query(Projects).filter_by(id=1).one()

この結果から列名を取得するにはどうすればよいですか。

PS:宣言構文を使用しているため、 this メソッドを使用できません。

29
Sukumar

違いはORMと非ORMの違いであり、宣言ではなく、ORMの単なるヘルパーです。

クエリには、この目的のために追加されたメソッドcolumn_descriptions()があります。

http://www.sqlalchemy.org/docs/orm/query.html#sqlalchemy.orm.query.Query.column_descriptions

そこの例は、タイプミスがあるようです、q.columnsしかし、それはq.column_descriptions(編集:修正済み)。

26
zzzeek

以下を行うことで、プライベートフィールドに頼らずに、Foo Stackの答えに似たことができます。

conn.execute(query).keys()
45
prolibertas
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import (Column, Index, Date, DateTime, Numeric, BigInteger, String, ForeignKey, Boolean)

Base = declarative_base()

class Project(Base):
    """sqlalchemy ORM for my table."""
    __tablename__ = "table1"
    id = Column("id", BigIntegerID, primary_key=True, autoincrement=True)
    date = Column("date", Date, nullable=False)
    value = Column("value", Numeric(20, 8))
    ...
    ...

次に、列名['id'、 'date'、 'value'、...]が返されます。

Project.__table__.columns.keys()

またはこれ

Project.metadata.tables['table1'].columns.keys()
25
Lydia

遊んでみると、この構文はすべての列を提供します(したがって、問題を解決するには、1つのテーブル/オブジェクトのみを見るようにクエリを設定します)。

conn.execute(query)._metadata.keys
7
Foo Stack

このリンクは、テーブル、列などについて必要なすべてのメタデータを取得する方法を示しています。

SQLAlchemyメタデータ

上記の回答の多くは、このページの情報に基づいています。テーブルを宣言したとします。

employees = Table('employees', metadata,
    Column('employee_id', Integer, primary_key=True),
    Column('employee_name', String(60), nullable=False),
    Column('employee_dept', Integer, ForeignKey("departments.department_id"))
)

以下は、テーブルに関するメタデータを取得するいくつかの例です。

# access the column "EMPLOYEE_ID":
employees.columns.employee_id

# or just
employees.c.employee_id

# via string
employees.c['employee_id']

# iterate through all columns
for c in employees.c:
    print(c)

# get the table's primary key columns
for primary_key in employees.primary_key:
    print(primary_key)

# get the table's foreign key objects:
for fkey in employees.foreign_keys:
    print(fkey)

# access the table's MetaData:
employees.metadata

# access the table's bound Engine or Connection, if its MetaData is bound:
employees.bind

# access a column's name, type, nullable, primary key, foreign key
employees.c.employee_id.name
employees.c.employee_id.type
employees.c.employee_id.nullable
employees.c.employee_id.primary_key
employees.c.employee_dept.foreign_keys

# get the "key" of a column, which defaults to its name, but can
# be any user-defined string:
employees.c.employee_name.key

# access a column's table:
employees.c.employee_id.table is employees

# get the table related by a foreign key
list(employees.c.employee_dept.foreign_keys)[0].column.table
1
Mark Kortink