gpt4 book ai didi

python - sqlalchemy Session 对象没有属性添加

转载 作者:行者123 更新时间:2023-12-05 03:41:55 39 4
gpt4 key购买 nike

我正在尝试将数据插入 mysql 服务器,当我尝试将数据添加到 SQLalchemy sesion 时,我收到错误“Generator object has no attribute add”

db=get_db()
temp = schema.User(**filtered_dict)
insert_data=models.User(**temp.dict())
db = get_db()
db.add(insert_data)
db.commit()
db.refresh()

session 生成器:

def get_db():

db_session = sessionlocal()
try:
yield db_session
finally:
db_session.close()

session 创建


from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "mysql+mysqlconnector://root:password@localhost:3305/line_api"

engine = create_engine(
SQLALCHEMY_DATABASE_URL
)
sessionlocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)


Base = declarative_base()

请帮忙...

最佳答案

简单的解决方案

我在自己使用 SQLAlchemy 的 FastAPI 项目中遇到了类似的问题。该问题源于从 yield 关键字收集数据库 session 。 yield 返回一个生成器,而不是像您期望的那样返回 sqlalchemy 数据库 session 。您可以在此处阅读有关 yield 表达式的更多信息: https://docs.python.org/3/reference/expressions.html#yieldexpr

要修复代码,您需要以某种形式在 get_db 返回的 generator 对象上调用内部 __next__ 函数。您可以通过多种方式执行此操作(有些方式可能比我的建议在文体上更准确)。

temp = schema.User(**filtered_dict)
insert_data=models.User(**temp.dict())
db_gen = get_db()
db = next(db_gen)
db.add(insert_data)
db.commit()
db.refresh()

使用对生成器的 var 引用进行编辑感谢评论中的@DustinMichels。

添加 next 函数调用应该可以解决问题。


使用异步生成器

因为我们没有在函数 get_db 前面加上 async,所以我们得到了一个普通的生成器。但是,如果我们将 async 添加到此函数定义中,我们将无法再使用 __next__ 作为解决方案。使函数异步也有助于确保正确关闭连接(参见注释)。

如果开发人员决定添加 async 关键字,那么您有几个选择:

FastAPI 的 Depends 系统与异步生成器完美配合,可以为您调用该函数,使用您的连接填充一个不错的参数。

或者,您可以在异步生成器上调用 asend(None) 以获取异步生成器的第一个值。 (还有更好的方法可以做到这一点,比如使用异步 for 循环或 __anext__ 函数调用)。更多内容请阅读:https://www.python.org/dev/peps/pep-0525/#implementation-details

async def get_db():
db_session = sessionlocal()
try:
yield db_session
finally:
db_session.close()

# ...

temp = schema.User(**filtered_dict)
insert_data=models.User(**temp.dict())
db = get_db().asend(None)
db.add(insert_data)
db.commit()
db.refresh()

关于python - sqlalchemy Session 对象没有属性添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67523421/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com