首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在数据库视图中使用SqlSoup时出错

在数据库视图中使用SqlSoup时出错
EN

Stack Overflow用户
提问于 2011-06-09 08:09:32
回答 3查看 1.2K关注 0票数 6

我想在包含视图的现有数据库中使用SqlSoup。访问表很顺利,但是访问视图会导致"PKNotFoundError: table 'viewname‘not not a primary key defined...“

我是否正确地推断SqlSoup不能与数据库视图一起工作(至少在默认情况下)?我一直无法在谷歌上找到任何直接相关的东西,所以,或者SqlAlchemy邮件列表。如果你面临这个问题,如果你想访问不可更新的视图,你会怎么做呢?我是SQLAlchemy和SQLSoup的新手。

下面是一个具体的例子:

代码语言:javascript
复制
from sqlalchemy.ext.sqlsoup import SqlSoup
u = SqlSoup('postgresql+psycopg2://PUBLIC@unison-db.org:5432/unison')
seq = u.pseq.filter(u.pseq.pseq_id==76).all() # okay
aliases = u.pseqalias.filter(u.pseqalias.pseq_id==76).all()

这是一个公共数据库。您可以使用psql运行等效的查询:

代码语言:javascript
复制
psql -h unison-db.org -U PUBLIC -d unison -c 'select * from pseq where pseq_id=76'
psql -h unison-db.org -U PUBLIC -d unison -c 'select * from pseqalias where pseq_id=76'
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-06 02:24:01

感谢Randy提供的map()提示。这是一个完整的解决方案,您可以逐字尝试(数据库是公开可用的):

代码语言:javascript
复制
from sqlalchemy.ext.sqlsoup import SqlSoup
from sqlalchemy import Table
u = SqlSoup('postgresql+psycopg2://PUBLIC@unison-db.org:5432/unison')
pa_t = Table("palias", u._metadata, autoload=True, schema='unison')
pa = u.map(pa_t,primary_key=[pa_t.c.pannotation_id])
pa.slice(0,20).all()

这是Python 2.7.1,Alchemy 0.7.2的版本。

有关参考信息,请参阅:

  • http://www.sqlalchemy.org/docs/core/schema.html?highlight=table#sqlalchemy.schema.Table
  • http://www.sqlalchemy.org/docs/orm/extensions/sqlsoup.html?highlight=map#sqlalchemy.ext.sqlsoup.SqlSoup.map
票数 3
EN

Stack Overflow用户

发布于 2011-08-05 00:52:35

来自Michael Bayer:

表您需要使用sqlsoup.map_to()将被视为主键一部分的列传递给底层映射器,但不幸的是,目前还没有用于此的简单接口,因为您还需要

对象来获取列。因此,在此界面得到改进之前,目前它看起来如下所示:

metadata = u._metadata t=表(“pseqaliases”,metadata,autoload=True)

u.map_to("pseqaliases",selectable=t,mapper_args={"primary_key":t.c.col1,t.c.col2})

这只是mapper的"primary_key“参数,在靠近顶部的http://www.sqlalchemy.org/docs/orm/mapper_config.html中有一些示例。

http://groups.google.com/group/sqlalchemy/browse_thread/thread/fc1e8d079e10bac8

我尝试了map_to()方法,但仍然收到PK错误。但是,以下方法运行良好:

代码语言:javascript
复制
ss = SqlSoup(db.engine)
meta = ss._metadata
tbl_vrmf = sa.Table("vRMF", meta, autoload=True)
vrmf_pks = [tbl_vrmf.c.dateId, tbl_vrmf.c.ident, tbl_vrmf.c.mnum]
vrmf = ss.map(tbl_vrmf, primary_key=vrmf_pks)
票数 1
EN

Stack Overflow用户

发布于 2011-06-09 14:03:40

类似于以下内容(未经测试):

代码语言:javascript
复制
from sqlalchemy import sql
from sqlalchemy.ext.sqlsoup import SqlSoup

u = SqlSoup('postgresql+psycopg2://PUBLIC@unison-db.org:5432/unison')

pseq_id = sql.column('pseq_id')
aliases = u.bind.execute(sql.select([pseq_id, '*'], from_obj=['pseqalias'])\
                .where(pseq_id==76)).fetchall()

当然,您可以只执行以下操作:

代码语言:javascript
复制
aliases = u.bind.execute('select * from pseqalias where pseq_id=76').fetchall()

...but,在这种情况下,你失去了可重用性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6286704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档