SQLAlchemy 视图处理

Mar*_*ton 3 python postgresql sqlalchemy

请告诉我如何以与在 TABLE 上使用 SQLAlchemy 的方式类似的方式从 VIEW 中选择和操作行。

如果 name_address_vw 是一个表(引擎已经使用 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)
Run Code Online (Sandbox Code Playgroud)

SQLAlchemy 失败,因为 name_address_vw 不是 meta.tables 的关键成员我明白这是因为它是一个视图,而不是一个表。

以下是用于设置和填充后端 PostgreSQL 的 SQL 语句:

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');
Run Code Online (Sandbox Code Playgroud)

如果我上面的 SQLAlchemy 代码不清楚,这里是 PostreSQL 查询等效:

SELECT name FROM name_address_vw WHERE address LIKE '%pad%' LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

显然,我给出的示例高度简化,一旦我检索到它们,我需要能够查询视图行上的其他列,所以请为我提供一个通用的解决方案,而不是仅适用于本示例的解决方案。非常感谢。

Ilj*_*ilä 9

自 0.8 版起不推荐使用reflect参数 of MetaData,应替换为更具表现力的MetaData.reflect()方法,该方法也允许反射视图

meta = MetaData(Engine)
meta.reflect(views=True)
nav = meta.tables['name_address_vw']
Run Code Online (Sandbox Code Playgroud)


小智 2

由于 2.0 将元数据对象绑定到引擎已被弃用,正确的方法是:

meta = MetaData()
meta.reflect(bind=Engine, views=True)
nav = meta.tables['name_address_vw']
Run Code Online (Sandbox Code Playgroud)

链接到文档:https://docs.sqlalchemy.org/en/14/changelog/migration_20.html#implicit-and-connectionless-execution-bound-metadata-removed