How to get column names from SQLAlchemy result (declarative syntax)

后端 未结 7 588
佛祖请我去吃肉
佛祖请我去吃肉 2021-02-01 01:26

I am working in a pyramid project and I\'ve the table in SQLAlchemy in declarative syntax

\"\"\"models.py\"\"\"
class Projects(Base):
    __tablename__ = \'proje         


        
相关标签:
7条回答
  • 2021-02-01 01:45

    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.

    0 讨论(0)
  • 2021-02-01 01:48

    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
    
    0 讨论(0)
  • 2021-02-01 01:49

    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
    
    0 讨论(0)
  • 2021-02-01 01:50

    You can do something similar to Foo Stack's answer without resorting to private fields by doing:

    conn.execute(query).keys()
    
    0 讨论(0)
  • 2021-02-01 01:56

    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).

    0 讨论(0)
  • 2021-02-01 01:58

    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']
    >>> 
    
    0 讨论(0)
提交回复
热议问题