【问题标题】:SQLAlchemy view handlingSQLAlchemy 视图处理
【发布时间】:2018-11-26 19:58:01
【问题描述】:

请告诉我如何以与在 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)

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');

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

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

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

【问题讨论】:

    标签: python postgresql sqlalchemy


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。这似乎是问题所在。
    • 有没有办法直接从 ORM、数据库会话或类似的访问 metadata 或者是否需要维护自己的 MetaData 实例?
    • @mikkoohtamaa 不是来自这样的会话。元数据是模式对象等的集合,因此会话不需要直接了解它——会话可以保存具有不同基础和不同元的映射对象。话虽如此,您可以使用其metadata 属性访问映射类或声明性基类的元数据,例如Base.metadata
    • 这让我们想到“是否需要维护自己的(元)?”答案是:当您创建声明性基类时,会为您隐式创建一个,但您也可以传递您自己的。
    猜你喜欢
    • 1970-01-01
    • 2020-01-15
    • 2020-03-12
    • 2019-12-25
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多