请告诉我如何从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;
我所给出的例子是高度简化的,我需要能够查询其他列的视图行,一旦我检索到他们,所以请提供一个一般的解决方案,而不是一个只与这个例子非常感谢我。
2条答案
按热度按时间rbl8hiat1#
MetaData
的reflect
参数的使用自0.8版以来已被弃用,应该替换为更具表现力的MetaData.reflect()
方法,该方法也允许反射视图:6ojccjat2#
由于2.0不推荐将元数据对象绑定到引擎,因此正确的方法是:
链接到文档:https://docs.sqlalchemy.org/en/14/changelog/migration_20.html#implicit-and-connectionless-execution-bound-metadata-removed。