I am working in a pyramid project and I\'ve the table in SQLAlchemy in declarative syntax
\"\"\"models.py\"\"\"
class Projects(Base):
__tablename__ = \'proje
Would like to extend @zzzeek's answer. Indeed Query has column_descriptions
attribute but it's not available for all the methods.
Consider the following two queries:
1. query = session.query(Projects).filter_by(<filter_condition>)
2. query = session.query(Projects).all() <-- This query does not have column_descriptions.
So if you come across this situation where you need to use column_descriptions
attribute but using ...query(...).all()
then you can change it to ...query(...).filter_by()
i.e. filter_by()
without any filter condition.
Just playing around, this syntax will give you all the columns (so to solve your problem, set query to look at one table/object only):
conn.execute(query)._metadata.keys
This link shows how to get all the metadata you could ever need about a table, column and more.
SQLAlchemy Metadata
Many of the answers above are based on the info on this page. Suppose we have declared a 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"))
)
Here are some examples of getting metadata about the 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
You can do something similar to Foo Stack's answer without resorting to private fields by doing:
conn.execute(query).keys()
The difference is between ORM and non-ORM, not declarative, which is just a helper for the ORM.
Query has a method column_descriptions()
that was added for this purpose::
http://www.sqlalchemy.org/docs/orm/query.html#sqlalchemy.orm.query.Query.column_descriptions
the example there seems like it has a typo, says q.columns
but it should be q.column_descriptions
(edit: just fixed it).
Just
>>> q[0].keys()
After
row_data = session.query(Projects).filter_by(id=1).one()
Example :
>>> q = session.query(users_user.phone,users_user.first_name).filter(users_user.phone=='79267548577').limit(1).all()
>>> columns_names = q[0].keys
Result :
>>> q[0].keys()
['phone', 'first_name']
>>>