当sqlalchemy ORM类属性与数据库列不同时,如何获取ORM类属性列表?

Tai*_*Tea 0 python sqlalchemy

假设您想在 sqlalchemy 中迭代 ORM 类的 ORM 属性。因此,您需要一个 ORM 属性列表。你是怎么得到那个名单的?

如果 ORM 类没有重命名属性,因此 ORM 属性与数据库列匹配,那么您可以使用以下解决方案:https : //stackoverflow.com/a/24748320/1023033 (顺便说一句,还有一个内置的源代码文件 /lib/sqlalchemy/orm/base.py 中的(私有)函数 _orm_columns() 似乎提供了此功能)

但是如果 python ORM 类的名称与数据库列的名称不同(例如在这 3 个 ORM 属性中):

>>> class User(Base):
...     __tablename__ = 'users'
...
...     id = Column('pkey', Integer, primary_key=True)
...     name = Column('user_name', String)
...     fullname = Column('human_name', String)
Run Code Online (Sandbox Code Playgroud)

那么那个方法就行不通了。那么,如何获得 ORM 属性的 Python 版本呢?

zzz*_*eek 5

这已经使用检查系统实现了:

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import inspect

Base = declarative_base()

class A(Base):
    __tablename__ = 'a'
    id = Column(Integer, primary_key=True)
    x = Column(Integer)
    y = Column(Integer)

print inspect(A).c
print inspect(A).c.x
print inspect(A).column_attrs
print inspect(A).column_attrs.x
print inspect(A).column_attrs.x.expression
Run Code Online (Sandbox Code Playgroud)

http://docs.sqlalchemy.org/en/latest/core/inspection.html

http://docs.sqlalchemy.org/en/latest/orm/mapping_api.html#sqlalchemy.orm.mapper.Mapper.all_orm_descriptors

http://docs.sqlalchemy.org/en/latest/orm/mapping_api.html#sqlalchemy.orm.mapper.Mapper.columns

http://docs.sqlalchemy.org/en/latest/orm/mapping_api.html#sqlalchemy.orm.mapper.Mapper.column_attrs

http://docs.sqlalchemy.org/en/latest/orm/mapping_api.html#sqlalchemy.orm.mapper.Mapper.c

  • 我们什么时候才能看到一种将 ORM 对象转换为 dict 的简单内置方法(支持非循环递归关系等)?使用 Flask-SQLAlchemy 时,这样做会很棒:`return jsonify([row.to_dict() for row in sqlalch_query.all()])` (3认同)