Ошибка при использовании SqlSoup с представлениями базы данных - PullRequest
6 голосов
/ 09 июня 2011

Я хотел бы использовать SqlSoup с существующей базой данных, содержащей представления.Доступ к таблице проходит гладко, но доступ к представлению приводит к тому, что «PKNotFoundError: таблица '[viewname]' не имеет определенного первичного ключа ...»

Правильно ли я понимаю, что SqlSoup не работает с представлениями базы данных(по умолчанию хотя бы)?Мне не удалось найти что-либо, имеющее непосредственное отношение к Google, SO или списку рассылки SqlAlchemy.Если бы вы столкнулись с этим, как бы вы поступили, если бы хотели получить доступ к не обновляемым представлениям?Я новичок в SQLAlchemy и SQLSoup.

Вот конкретный пример:

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:

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'

Ответы [ 3 ]

3 голосов
/ 05 августа 2011

Спасибо Рэнди за подсказку по карте (). Вот полное решение, которое вы можете попробовать дословно (база данных общедоступна):

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, Алхимия 0.7.2.

Для справок см .:

1 голос
/ 04 августа 2011

От Майкла Байера:

Вам нужно будет передать столбцы, которые будут считаться частью первичного ключа, в базовый маппер, используя sqlsoup.map_to (), но, к сожалению, нет простогоинтерфейс для этого на данный момент, так как вам нужен объект таблицы, чтобы добраться до столбцов.Таким образом, пока этот интерфейс не может быть улучшен, сейчас он будет выглядеть следующим образом:

metadata = u._metadata t = Table ("pseqaliases", metadata, autoload = True)

u.map_to ("pseqaliases", selectable = t, mapper_args = {"primary_key": [tccol1, tccol2]})

Это просто аргумент "primary_key" для картографа, есть несколько примеров на http://www.sqlalchemy.org/docs/orm/mapper_config.htmlоколо вершины.

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

Я попробовал метод map_to (), но все еще получил ошибку PK.Следующий метод, однако, работал нормально:

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)
0 голосов
/ 09 июня 2011

Примерно так (не проверено):

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()

Конечно, вы можете сделать только:

aliases = u.bind.execute('select * from pseqalias where pseq_id=76').fetchall()

... но в этом случае вы теряете возможность повторного использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...