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
答案 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,请使用它。