postgresql SQLAlchemy视图处理

hfwmuf9z  于 2023-04-20  发布在  PostgreSQL
关注(0)|答案(2)|浏览(153)

请告诉我如何从VIEW中选择和操作行,类似于我如何在TABLE上使用SQLAlchemy。
如果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)

SQLAlchemy失败,因为name_address_vw不是 meta的键成员,我理解这是因为它是一个视图,而不是一个表。
以下是用于设置和填充后端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');

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

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

我所给出的例子是高度简化的,我需要能够查询其他列的视图行,一旦我检索到他们,所以请提供一个一般的解决方案,而不是一个只与这个例子非常感谢我。

rbl8hiat

rbl8hiat1#

MetaDatareflect参数的使用自0.8版以来已被弃用,应该替换为更具表现力的MetaData.reflect()方法,该方法也允许反射视图:

meta = MetaData(Engine)
meta.reflect(views=True)
nav = meta.tables['name_address_vw']
6ojccjat

6ojccjat2#

由于2.0不推荐将元数据对象绑定到引擎,因此正确的方法是:

meta = MetaData()
meta.reflect(bind=Engine, views=True)
nav = meta.tables['name_address_vw']

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

相关问题