get table columns from sqlAlchemy table model

28,600

Solution 1

You get all of the columns from __table__.columns:

myTable.__table__.columns

or

myTable.__table__.c

The columns would be in format myTable.col1 (table name is included). If you want just column names, get the .key for each column:

[column.key for column in myTable.__table__.columns]

Solution 2

Below is a general as_dict implementation for an sqlalchemy table based on @ChaimG answer. And an additional example of a __repr__ that is implemented using it.

from orm.base import Base


class MyTable(Base):
    __tablename__ = 'table_name'

    # Columns go here.....

    def as_dict(self):
        """
        Helper function that allows traversing the table's instance columns as key values

        :return: (key, value) iterator
        """
        for key in self.__table__.columns.keys():
            value = self.__getattribute__(key)
            yield key, value

    def __repr__(self):
        """
        General __repr__ implementation for an sqlalchemy table
        """
        values = []
        for key, value in self.as_dict():
            key_value_str = f"{key}={value}"
            values.append(key_value_str)

        values_str = ", ".join(values)
        cls_name = self.__class__.__name__
        return f"<{cls_name}({values_str})>"
Share:
28,600
john
Author by

john

Updated on July 28, 2022

Comments

  • john
    john almost 2 years

    I have a table where I would like to fetch all the column names however after browsing the interwebs I could not find a way that works. This is what my table looks like:

    class myTable(Base):
        __tablename__ = 'myTable'
    
        col1 = Column(Integer, primary_key=True)
        col2 = Column(Unicode(10))
        col3 = Column(Integer)
    
        col4 = Column(Numeric(10, 6))
        col5 = Column(Numeric(6,3))
        col6 = Column(Numeric(6,3))
    
        child = relationship('tChild',
                              backref=backref('children'))
    

    I would like to be able to print all the column names from a for loop. ex:

    "col1", "col2", "col3".... etc
    

    This is pretty easy with regular sql but I can't seem to figure out how to do it using sqlAlchemy table models