在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 theTable
object as theself
argument, becauseSession
is the class, not an instance. The usual way to make a pre-configured session is to usesessionmaker
to create a tailored version of theSession
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,非常多的使用方式,我在这里就不再解释了;
请尊重原创,转载注明出处,谢谢!