swa*_*223 3 python orm sqlalchemy
我想使用命令式数据类映射将我的数据类映射到列
以下教程我将定义模型:
@dataclass
class User:
id: int = field(init=False)
name: str = None
fullname: str = None
nickname: str = None
addresses: List[Address] = field(default_factory=list)
Run Code Online (Sandbox Code Playgroud)
然后将其映射到列:
user = Table(
"user",
metadata_obj,
Column("id", Integer, primary_key=True),
Column("name", String(50)),
Column("fullname", String(50)),
Column("nickname", String(12)),
)
Run Code Online (Sandbox Code Playgroud)
最后我用一些对象填充数据库。当我想取回模型时出现问题;
q = select(User)
first = engine.execute(q).first()
Run Code Online (Sandbox Code Playgroud)
这给了我一个 sqlalchemy.engine.row.LegacyRow 实例。(我知道我在 _mapping 属性下得到了 dict)当我想从 ORM 中获取 User 实例时,它更多的是一个低级结构。
此外,由于 id 字段上的 init=False 选项,创建构造函数类方法不会有帮助。
那么可以使用我的模型吗?
正如该问题的评论中所指出的:
\nSession.execute()用于返回 ORM 对象。engine.execute()在 SQLAlchemy 1.4 中被视为遗留(已弃用),并将在 2.0 中删除。所以如果我们这样做
\nfrom sqlalchemy.orm import Session\nfrom sqlalchemy import select\nwith Session(engine) as sess:\n result = sess.execute(select(User)).first()\n print(result)\n # (User(id=1, name=\'Gord\', fullname=None, nickname=None, addresses=[]),)\n print(type(result)) # <class \'sqlalchemy.engine.row.Row\'>\nRun Code Online (Sandbox Code Playgroud)\n我们注意到我们仍然得到一个Row对象,如果我们只想要 ORM 对象,我们需要从行中提取它:
item = result[0]\n print(item)\n # User(id=1, name=\'Gord\', fullname=None, nickname=None, addresses=[])\n print(type(item)) # <class \'__main__.User\'>\nRun Code Online (Sandbox Code Playgroud)\n为了避免这种麻烦,我们可以.scalars()在.execute()
result = sess.execute(select(User)).scalars().first()\n print(result)\n # User(id=1, name=\'Gord\', fullname=None, nickname=None, addresses=[])\n print(type(result)) # <class \'__main__.User\'>\nRun Code Online (Sandbox Code Playgroud)\n尽管首选方法是使用Session.scalars(\xe2\x80\xa6),这是一个方便的简写Session.execute(\xe2\x80\xa6).scalars()
result = sess.scalars(select(User)).first()\n print(result)\n # User(id=1, name=\'Gord\', fullname=None, nickname=None, addresses=[])\n print(type(result)) # <class \'__main__.User\'>\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1911 次 |
| 最近记录: |