sqlalchemy AttributeError: ‘Table‘ object has no attribute ‘query‘ 如何解决

在Sqlalchemy中,我一直是分两部分来用的,插入数据库的时候是直接使用的模型对象,而查询数据的时候都是使用的原生sql语句,但是插入原生sql太麻烦,感觉代码太凌乱了,没有直接使用模型对象查询方便,所以就触发了这个问题;

 

话不多说,直接上代码解释:


    def get_model_table(self, table_name):
        # get database model
        metadata = MetaData()
        tb_name = Table(table_name, metadata, autoload=True, autoload_with=self.engine)
        return tb_name

以上代码就是我在插入数据库的时候封装的函数,直接从MetaData这个对象中来初始化一个模型表对象,我一般如何使用呢?请看以下代码实现了分别是增删改的操作,以及提交commit的操作,完整版点击此处查看:

    def insert_data(self, table_name, value):
        try:
            ret = self.session_db.execute(table_name.insert(), value)
        except Exception as e:
            self.session_db.rollback()
            self.session_db.close()
            current_app.logger.error("Add data failed, please try again later,and check error log-->%s" % e)
            return False
        self.change_commit()
        return ret

    def delete_data(self, table_name, condition=''):
        try:
            delete_sql = table_name.delete().where(condition)
            self.session_db.execute(delete_sql)
        except Exception as e:
            self.session_db.rollback()
            self.session_db.close()
            current_app.logger.error("Delete data failed, please try again later,and check error log-->%s" % e)
            return False
        self.change_commit()
        return True

    def update_data(self, table_name, condition, value):
        try:
            update_sql = table_name.update().where(condition).values(value)
            self.session_db.execute(update_sql)
        except Exception as e:
            self.session_db.rollback()
            self.session_db.close()
            current_app.logger.error("Update data failed, please try again later,and check error log-->%s" % e)
            return False
        self.change_commit()
        return True

    def change_commit(self):
        try:
            self.session_db.flush()
            self.session_db.commit()
            self.session_db.close()
        except Exception as e:
            self.session_db.rollback()
            self.session_db.close()
            current_app.logger.error("Commit  data failed, please try again later,and check error log-->%s" % e)
            return False

但是虽然插入数据库方便了,但是查询数据不能使用这个模型对象,直接使用模型对象.query就会报上面的错“sqlalchemy AttributeError: 'Table' object has no attribute 'query'”当前对象没有query这个方法,下面告诉大家如何解决,使用模型表的对象来query查询数据;

首先感谢StackOverflow上面的大神解答,引用原话如下:

you are not calling a method of a Session instance, but passing the Table object as the self argument, because Session is the class, not an instance. The usual way to make a pre-configured session is to use sessionmaker to create a tailored version of the Session class, and then instantiate it:

from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm import sessionmaker

engine = create_engine(db_uri)
metadata = MetaData(engine)
metadata.reflect()
table = metadata.tables["events"]
Session = sessionmaker(bind=engine)
session = Session()
session.query(table).all()

根据他的回答,原来是因为query这个方法是在sessionmaker里面的,需要再进行一层封装,于是乎我就在原来的工具类基础上添加了如下这个方法,获取session对象

    def get_session(self):
        Session=sessionmaker(bind=self.engine)
        session=Session()
        return session

获取到这个对象,query起来就好操作了,查询的时候你只需要:

session.query(获取到的模型对象调用get_model_table 这个方法).filter_by(字段名='条件').first()

如此使用sqlalchemy的一个完整流程,正删改查就都可以操作了,如果想以更多种方式查询,那就直接去百度搜索一下sqlalchemy query,非常多的使用方式,我在这里就不再解释了;

请尊重原创,转载注明出处,谢谢! 

你可能感兴趣的:(sqlalchemy查询数据)