Je travaille dans un projet pyramidal et j'ai la table dans SQLAlchemy en syntaxe déclarative
"""models.py"""
class Projects(Base):
__tablename__ = 'projects'
__table_args__ = {'autoload': True}
J'obtiens les résultats en utilisant
""""views.py"""
session = DBSession()
row_data = session.query(Projects).filter_by(id=1).one()
Comment puis-je obtenir les noms de colonne de ce résultat.
PS: je ne peux pas utiliser la méthode this car j'utilise la syntaxe déclarative.
La différence est entre ORM et non-ORM, non déclarative, qui est juste une aide pour l'ORM.
La requête a une méthode column_descriptions()
qui a été ajoutée à cet effet ::
http://www.sqlalchemy.org/docs/orm/query.html#sqlalchemy.orm.query.Query.column_descriptions
l'exemple semble avoir une faute de frappe, dit q.columns
mais ça devrait être q.column_descriptions
(modifier: vient de le corriger).
Vous pouvez faire quelque chose de similaire à la réponse de Foo Stack sans recourir à des champs privés en faisant:
conn.execute(query).keys()
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))
...
...
Ensuite, cela renverra les noms des colonnes ['id', 'date', 'value', ...]:
Project.__table__.columns.keys()
Ou ca
Project.metadata.tables['table1'].columns.keys()
Juste en jouant, cette syntaxe vous donnera toutes les colonnes (donc pour résoudre votre problème, définissez la requête pour ne regarder qu'une seule table/objet):
conn.execute(query)._metadata.keys
Ce lien montre comment obtenir toutes les métadonnées dont vous pourriez avoir besoin sur une table, une colonne et plus encore.
La plupart des réponses ci-dessus sont basées sur les informations de cette page. Supposons que nous ayons déclaré une table.
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"))
)
Voici quelques exemples d'obtention de métadonnées sur la table.
# 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