Ошибка использования SqlSoup с представлениями базы данных
Я хотел бы использовать SqlSoup с существующей базой данных, содержащей представления. Доступ к таблице идет плавно, но доступ к результатам просмотра в «PKNotFoundError: table» [viewname] «не имеет определяемого первичного ключа …»
Правильно ли вы заключаете, что SqlSoup не работает с представлениями базы данных (по крайней мере, по умолчанию)? Я не смог найти что-либо прямое релевантное в списке рассылки Google, SO или SqlAlchemy. Если бы вы столкнулись с этим, как бы вы поступите, если хотите получить доступ к невосстанавливаемым представлениям? Я новичок в SQLAlchemy и SQLSoup.
- Как обновить объект orlChalchemy orm с помощью python dict
- Python: strftime временная метка UTC для локального формата времени
- Странно, что мое соединение SQLAlchemy MySQL всегда заканчивается спать?
- AttributeError: объект 'unicode' не имеет атрибута '_sa_instance_state'
- SQLAlchemy: getter / setter в декларативном классе Mixin
Вот пример:
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'
- Сельдерей и SQLAlchemy - этот объект результата не возвращает строки. Он был автоматически закрыт
- SQLAlchemy: создать преднамеренно пустой запрос?
- Flask-WhooshAlchemy с существующей базой данных
- Как проинструктировать ORM SQLAlchemy для одновременного выполнения нескольких запросов при загрузке отношений?
- Сравнение экземпляров объектов SQLAlchemy для равноправия атрибутов
3 Solutions collect form web for “Ошибка использования SqlSoup с представлениями базы данных”
Спасибо Рэнди за подсказку map (). Вот полное решение, которое вы можете попробовать verbatim (база данных общедоступна):
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.
См. Ссылки:
От Майкла Байера:
Вам нужно будет передать столбцы, которые будут считаться частью первичного ключа для базового модуля, используя sqlsoup.map_to (), но, к сожалению, на данный момент для этого нет простого интерфейса, так как вам нужен объект Table, а также получить в столбцах. Поэтому, пока этот интерфейс не будет улучшен, на данный момент это будет выглядеть так:
metadata = u._metadata t = Таблица ("pseqaliases", метаданные, autoload = True)
u.map_to ("pseqaliases", selectable = t, mapper_args = {"primary_key": [tccol1, tccol2]})
Это просто аргумент «primary_key» для mapper, есть несколько примеров на 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)
Что-то вроде этого (непроверено):
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()
… но в этом случае вы теряете возможность повторного использования.