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