【问题标题】:SQLAlchemy select only one columnSQLAlchemy 只选择一列
【发布时间】:2022-04-08 20:02:53
【问题描述】:

尝试通过以下方式从 pg_shadow 表中选择一列:

role_tbl = Table('pg_shadow', MetaData(engine), autoload=True)
db.query(role_tbl.c.passwd).filter_by(usename='name')

并得到一个错误:

* AttributeError: 'NoneType' 对象没有属性 'class_'

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    错误是no entity in the query:

    关键字表达式是从查询的主要实体中提取的,或者是作为Query.join() 调用目标的最后一个实体。

    实体是映射类或Table 对象,但您查询的是单个列。过滤的正确方法是:

    db.query(role_tbl.c.passwd).filter(role_tbl.c.usename == 'name')
    

    在更新版本的 SQLAlchemy 中,错误是:

    NoInspectionAvailable: No inspection system is available for object of type <class 'NoneType'>
    

    【讨论】:

      【解决方案2】:

      试试这个:

      role_tbl.select([role_tbl.c.passwd]).where(username=='name').execute().fetchall()
      

      或者此表中可能没有这样的列。

      您可以通过打印所有列来检查它

      print role_tbl.columns
      

      附: 您还应该使用一个元数据实例:MetaData(engine)(它应该存储有关所有表的信息)

      【讨论】:

        【解决方案3】:

        要仅选择一列,您可以使用Select.with_only_columns

        from sqlalchemy import MetaData, Table, Column, Text
        meta = MetaData()
        table = Table('user', meta,
                      Column("name", Text),
                      Column("full_name", Text))
        stmt = (table.select()
                .with_only_columns([table.c.name])
               )
        print(stmt)
        
        # SELECT "user".name
        # FROM "user"
        

        【讨论】:

          猜你喜欢
          • 2021-08-20
          • 2016-09-05
          • 2014-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-08
          相关资源
          最近更新 更多