🐵个人主页:ximury.blog.csdn.net
🐸Github:github.com/ximury
🐹精言佳句:有的人是打火机,遇到谁都能点着;有的人是火柴,只能燃烧一次。
打印实际SQL语句
方式一:
app.config["SQLALCHEMY_ECHO"] = True
方式二:
db_query = db.session.query(...).filter(*sql_condition)
print(db_query)
方式三:
db_query = db.session.query(...).filter(*sql_condition)
sql = db_query.statement.compile(db.engine, compile_kwargs={"literal_binds": True})
print(sql)
sqlalchemy对象转dict
方式一:
db_query = db.session.query(...).filter(*sql_condition).first()
if not db_query:
return
print(db_query[0].__dict__)
{‘_sa_instance_state’: <sqlalchemy.orm.state.InstanceState object at 0x7f63686114c0>, ‘id’: ‘11b22f251de27b90032235861c09e74e’…}
方式二:
ORM model下添加函数:
def to_dict(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
db_query = db.session.query(...).filter(*sql_condition).first()
if not db_query:
return
print(db_query.to_dict())
方式三:
def to_dict(self):
def __is_super_attr__(_self, _attr):
for cls in _self.__class__.mro():
if cls == self.__class__:
continue
if _attr == "query":
return True
if hasattr(cls, _attr):
return True
return False
data = {}
for attr in dir(self):
if attr.startswith("_"):
continue
if __is_super_attr__(self, attr):
continue
if isinstance(getattr(self, attr), types.MethodType):
continue
value = getattr(self, attr)
if isinstance(value, datetime):
value = value.strftime("%Y-%m-%d %H:%M:%S")
data[attr] = value
return data
调用方法同方式二中所示!
sqlalchemy查看执行计划
db_query = db.session.query(...).filter(*sql_condition)
sql = db_query.statement.compile(db.engine, compile_kwargs={"literal_binds": True})
res = db.session.execute(f'EXPLAIN {sql}')
print(res)