Python 获取自定义的列名

自己在db_model中定义的一些类(Table),想只获取自定义的列名称,试了dir 和 __dict__的方法。

dir -- 会列出所有的属性和方法,利用filter试着去掉下划线,或者过滤去掉builtin,剩下一些还是无法过滤掉的属性,比如metadata, register

__dict__ 只返回已赋值的属性

后来发现inspect的getmember中有个__table__属性会列出自定义的列,因此采用这个方法。如下是代码 --

db_model.py中类的定义


class User(Base):
    __tablename__ = 't_users'
    id = Column(Integer, primary_key=True)
    sys_creation_date = Column(DateTime, default=datetime.datetime.now)
    sys_update_date = Column(DateTime, default=datetime.datetime.now)

    username = Column(String(64), nullable=False, index=True)
    status = Column(Enum('Active', 'Obsolete'), nullable=False, index=True, default='Active')
    password = Column(String(64), nullable=True)
    email = Column(String(64), nullable=True, index=False)
    modules = Column(String(64), nullable=True, index=False)

    face_feature = Column(BLOB, nullable=True, index=False)
    voice_feature = Column(BLOB, nullable=True, index=False)

获取列名称的方法:

mport inspect

key = "__table__"

def get_columns(db_model_object):

    result = {}

    members = inspect.getmembers(db_model_object, not inspect.isbuiltin)
    members_dict = dict(members)
    columns = members_dict.get(key).columns

    for col in columns:
        dict_mem = dict(inspect.getmembers(col, not inspect.isbuiltin))
        result[dict_mem['name']] = str(dict_mem['type'])
    return result


if __name__ == '__main__':
    from models.mysql_db import User
    user = User(username='123')
    result = get_columns(user)
    print(result)

这是输出:

"D:\Program Files\Python\Python39\python.exe" E:/source_code/python/flask_projs/db_opt/basic_module.py
{'id': 'INTEGER', 'sys_creation_date': 'DATETIME', 'sys_update_date': 'DATETIME', 'username': 'VARCHAR(64)', 'status': 'VARCHAR(8)', 'password': 'VARCHAR(64)', 'email': 'VARCHAR(64)', 'modules': 'VARCHAR(64)', 'face_feature': 'BLOB', 'voice_feature': 'BLOB'}

Process finished with exit code 0

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值