为什么要使用sqlalchemy声明式api?

时间:2016-08-03 12:02:40

标签: python postgresql sqlalchemy

sqlalchemy的新手,有点编程和python的新手。我原本想查询一张桌子。看来我可以在查询时使用all()函数,但不能在不创建类的情况下进行过滤。

1。)我可以在不创建类并使用声明性api的情况下进行过滤吗?下面说明的过滤示例是否不正确? 2.)什么时候在sqlalchemy中使用声明性api以及何时不合适?

import sqlalchemy as sql
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import sessionmaker

db = sql.create_engine('postgresql://postgres:password@localhost:5432/postgres')
engine = db.connect()
meta = MetaData(engine)
session = sessionmaker(bind=engine)
session = session()

files = Table('files',meta,
Column('file_id',Integer,primary_key=True),
Column('file_name',String(256)),
Column('query',String(256)),
Column('results',Integer),
Column('totalresults',Integer),
schema='indeed')

session.query(files).all() #ok
session.query(files).filter(files.file_name = 'test.json') #not ok

2 个答案:

答案 0 :(得分:1)

以这种方式使用声明式api进行过滤:

session.query(files).filter(files.file_name == 'test.json').all()

您还可以使用原始SQL查询(docs)。

是否使用声明性api可能取决于您的查询复杂性,因为有时sqlalchemy不会正确地优化它们。

答案 1 :(得分:1)

如果要按Table构造进行过滤,则应为:

session.query(files).filter(files.c.file_name == 'test.json')

如果要使用SQLAlchemy的ORM功能,则需要创建映射类。例如,使用您当前拥有的代码,为了进行更新,您必须执行

session.execute(files.update().values(...))

相反:

file = session.query(File).first()
file.file_name = "new file name"
session.commit()

声明性API恰好是构造映射类的最简单方法,因此如果要使用ORM,请使用它。