python - SQLAlchemy - 从自动加载表的内部连接映射列的子集

标签 python orm sqlalchemy

我刚刚开始使用 SQLAlchemy 来处理现有的 Postgres 数据库。我想做的是自动加载两个表,执行内部联接并将列的子集映射到一个对象。为了完成除最后一部分以外的所有工作,我编写了以下代码:

from sqlalchemy.orm import mapper, sessionmaker
from sqlalchemy.sql import join, select

engine = create_engine("postgresql://<username>:@localhost/<DBname>")
metadata = Metadata(engine)
Session = sessionmaker(engine)
profiles = Table('userprofile',metadata,autoload=True)
profilefields = Table('profilefield',metadata,autoload=True)
class DBObj(object):
     pass
j = join(profiles,profilefields,profiles.c.fieldid==profilefields.c.fieldid)
mapper(DBObj,j,properties={'fieldid':[profiles.c.fieldid,profilefields.c.fieldid]})
q = session.query(DBObj).all()

我应该如何修改此代码以断言我只希望将某些指定的列映射到 DBObj?我进行了广泛的搜索,但似乎找不到如何完成此操作的示例。

最佳答案

您需要映射一个 select()与所需的列。映射 join()导致sqlalchemy把它变成对应的select * from <join> :

(跳过此 block :这只是创建测试夹具)

>>> from sqlalchemy.orm import mapper, sessionmaker
>>> from sqlalchemy.sql import join, select
>>> from sqlalchemy import *
>>> # engine = create_engine("postgresql://<username>:@localhost/<DBname>")
... engine = create_engine("sqlite:///:memory:")
>>> engine.execute(r"""
...     CREATE TABLE userprofile (
...         id integer primary key,
...         fieldid integer,
...         keep integer,
...         discard integer
...     )
... """)
<sqlalchemy.engine.base.ResultProxy object at 0x2390d90>
>>> engine.execute(r"""
...     CREATE TABLE profilefield (
...         id integer primary key,
...         fieldid integer,
...         keep integer,
...         discard integer
...     )
... """)
<sqlalchemy.engine.base.ResultProxy object at 0x2390e90>
>>> metadata = MetaData(engine)
>>> Session = sessionmaker(engine)
>>> profiles = Table('userprofile',metadata,autoload=True)
>>> profilefields = Table('profilefield',metadata,autoload=True)
>>> engine.execute(profiles.insert({'fieldid': 1, 'keep': 2, 'discard': 3}))
<sqlalchemy.engine.base.ResultProxy object at 0x23e9750>
>>> engine.execute(profilefields.insert({'fieldid': 1, 'keep': 2, 'discard': 3}))
<sqlalchemy.engine.base.ResultProxy object at 0x23e98d0>
>>> class DBObj(object):
...      def __repr__(self):
...         return "DBobj" + str(self.__dict__)
... 

>>> j = join(profiles,
...          profilefields,
...          profiles.c.fieldid==profilefields.c.fieldid)

这是新的部分:

>>> js = select([profiles.c.id,
...              profiles.c.keep,
...              profilefields.c.keep,
...              profiles.c.fieldid,
...              profilefields.c.fieldid],
...             use_labels=True,
...             from_obj=j)
>>> mapper(DBObj,alias(js),properties={'fieldid':[profiles.c.fieldid,profilefields.c.fieldid]})
<Mapper at 0x23e9ad0; DBObj>
>>> q = Session().query(DBObj).all()
>>> q
[DBobj{u'userprofile_keep': 2, u'userprofile_id': 1, '_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x23f08d0>, 'fieldid': 1, u'profilefield_keep': 2}]

关于python - SQLAlchemy - 从自动加载表的内部连接映射列的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7690107/

相关文章:

Python:相同形状数组的元素比较

ios - 使用 SharkORM 从本地包读取 SQLite 数据库

SQLAlchemy 从列中获取标签名称

python - 如何在 SqlAlchemy 中查询具有分钟/小时步长间隔的行?

python - 如何编写div类属性BeautifulSoup

python - 正则表达式:从字符串列表创建字典

php - 使用通配符过滤关系

java - Hibernate @PostLoad 永远不会被调用

python - 为什么 SQLAlchemy 关联对象中的外键被标记为主键?

python - 不是有效的正则表达式