Flask中用SQLAlchemy ORM将SQLite User表转DataFrame报错求助
解决Flask中SQLAlchemy模型转Pandas DataFrame的问题
你原来的代码报错是因为SQLAlchemy的User模型实例不能直接用dict(r)转换,它本身不是可迭代的键值对结构。给你几种靠谱的写法:
方法一:用SQLAlchemy inspect工具提取字段
通过sqlalchemy.inspect可以安全获取模型实例的数据库字段和对应值,避免拿到内部属性:
from sqlalchemy import inspect import pandas as pd # 查询所有用户记录 user_records = User.query.all() # 把每个实例转成只包含数据库列的字典 user_dicts = [inspect(user).attrs for user in user_records] # 生成DataFrame df = pd.DataFrame(user_dicts)
方法二:给模型类加转字典方法
在User模型里自定义一个方法,专门返回数据库字段的键值对,复用性强:
class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) def to_dict(self): # 遍历表的所有列,提取对应值 return {col.name: getattr(self, col.name) for col in self.__table__.columns} # 转换时调用方法 users = User.query.all() df = pd.DataFrame([user.to_dict() for user in users])
方法三:直接用Pandas读取SQL(最高效)
不用先把实例加载到内存,直接通过数据库引擎查询生成DataFrame,数据量大时更合适:
import pandas as pd # 方式1:直接写SQL语句 df = pd.read_sql("SELECT * FROM user", db.engine) # 方式2:用模型的查询语句(更贴合SQLAlchemy风格) df = pd.read_sql(User.__table__.select(), db.engine)
内容的提问来源于stack exchange,提问作者macxpat
相关产品推荐
相关产品推荐

