Обработка представления SQLAlchemy - PullRequest
0 голосов
/ 26 ноября 2018

Пожалуйста, скажите мне, как выбирать и манипулировать строками из VIEW аналогично тому, как я использую SQLAlchemy в TABLE.

Вот как я бы сделал запрос, если бы name_address_vw был таблицей (Engine уже установлениспользование JDBC Psycopg2 для базы данных PostgreSQL (не показано):

meta = MetaData(Engine,reflect=True)
nav = meta.tables['name_address_vw']
Session = sessionmaker(bind=engine)
session = Session()
navRow = session.query(
        nav
    ).filter(
        nav.c.address.like("%pad%")
    ).first()
print (navRow.name)

Сбой SQLAlchemy, поскольку name_address_vw не является ключевым членом meta.tables. Я понимаю, что это потому, что это представление, а не таблица.

Вот операторы SQL для настройки и заполнения серверной части PostgreSQL:

CREATE TABLE name
(
    id SERIAL PRIMARY KEY,
    name VARCHAR NOT NULL
);

CREATE TABLE address
(
    id SERIAL PRIMARY KEY,
    idA INTEGER REFERENCES name(id),
    address VARCHAR
);

CREATE VIEW name_address_vw AS SELECT
    A.id,
    A.name,
    B.address
FROM name A
LEFT JOIN address B ON A.id = B.idA;

INSERT INTO name(
id, name)
VALUES 
    (1, 'John Soap'),
    (2, 'Jane Doe');

INSERT INTO address(
id, idA, address)
VALUES
    (1, 1, 'John''s place'),
    (2, 2, 'Jane''s pad');

В случае, если мой приведенный выше код SQLAlchemy неясен, вот эквивалент запроса PostreSQL:

SELECT name FROM name_address_vw WHERE address LIKE '%pad%' LIMIT 1;

Очевидно, что приведенный мной пример сильно упрощен, и мне нужно иметь возможность запрашивать другие столбцы в строках представления после того, как я их получу, поэтому, пожалуйста, предоставьте мне общее решение, а не то, которое работает исключительно с этимпример.Большое спасибо.

1 Ответ

0 голосов
/ 26 ноября 2018

Использование reflect параметра MetaData устарело с версии 0.8 и должно быть заменено более выразительным MetaData.reflect() методом, что позволяет отражать представления , а также:

meta = MetaData(Engine)
meta.reflect(views=True)
nav = meta.tables['name_address_vw']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...