如何使用sqlalchemy选择所有行?

80

我正在尝试获取表中的所有行。

在控制器中,我有:

meta.Session.query(User).all()

结果是 [, ],但是这个表格有2行。

我使用以下模型来创建这个表格:

import hashlib
import sqlalchemy as sa
from sqlalchemy import orm

from allsun.model import meta

t_user =  sa.Table("users",meta.metadata,autoload=True)

class Duplicat(Exception):
    pass
class LoginExistsException(Exception):
    pass
class EmailExistsException(Exception):
    pass

接下来,在同一文件中:

class User(object):
    def loginExists(self):
        try:
            meta.Session
                .query(User)
                .filter(User.login==self.login)
                .one()
        except orm.exc.NoResultFound:
            pass
        else:
            raise LoginExistsException()

    def emailExists(self):
        try:
            meta
                .Session
                .query(User)
                .filter(User.email==self.email)
                .one()
        except orm.exc.NoResultFound:
            pass
        else:
            raise EmailExistsException()


    def save(self):
        meta.Session.begin()
        meta.Session.save(self)
        try:
            meta.Session.commit()
        except sa.exc.IntegrityError:
            raise Duplicat()

orm.mapper(User, t_user)

9
没有足够的信息来重现您的问题。[, ]是什么?它不是有效的Python表达式,而看起来像是在HTML中打印一个包含两个项目[<User instance at ...>, <User instance at ...>]的列表,但没有正确进行转义。 - Denis Otkidach
为了解决这个问题,你可以使用 from flask import Markup 然后返回 return Markup("%r") % User.query.all() - Dr. Jan-Philip Gehrcke
2个回答

126

您可以轻松地导入您的模型并运行此代码:

from models import User

# User is the name of table that has a column name
users = User.query.all()

for user in users:
    print user.name

3
使用这段代码和使用 session.query(SomeTable).all() 有什么区别? - Progs
2
我相信 'User.query.all()' 使用的是核心。而 ´session.query(SomeTable).all()´ 则是ORM。 - Shoopyman
10
注意:据我从文档中看到,这种语法仅在使用Flask-SQLAlchemy时可用,而不是直接使用SQLAlchemy,后者使用select(User)函数。 - OzzyTheGiant
当你执行 print(user) 时,它会以 <TableName primary_key> 的格式打印出来。我认为这可能会对你有所帮助。如果要访问每行的某个列条目,可以执行 print(user.column_name)。祝一切顺利! - Muneeb Ahmad Khurram

11

我使用以下代码片段来查看表格中的所有行。使用查询语句来查找所有行。返回的对象是类实例。可以根据需要使用它们来查看/编辑值:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine, Sequence
from sqlalchemy import String, Integer, Float, Boolean, Column
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class MyTable(Base):
    __tablename__ = 'MyTable'
    id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
    some_col = Column(String(500))

    def __init__(self, some_col):
        self.some_col = some_col

engine = create_engine('sqlite:///sqllight.db', echo=True)
Session = sessionmaker(bind=engine)
session = Session()

for class_instance in session.query(MyTable).all():
    print(vars(class_instance))

session.close()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接