【问题标题】:How can I select all rows with sqlalchemy?如何使用 sqlalchemy 选择所有行?
【发布时间】:2011-02-07 15:50:20
【问题描述】:

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

在控制器中我有:

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)

【问题讨论】:

  • 没有足够的信息来重现您的问题。 [, ] 是什么?它不是有效的 python 表达式,但看起来您正在 HTML 上打印两个项目的列表[<User instance at ...>, <User instance at ...>],而没有正确转义它。
  • 解决这个问题你可以先from flask import Markup然后return Markup("%r") % User.query.all()

标签: python sqlalchemy pylons


【解决方案1】:

您可以轻松导入模型并运行:

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

【讨论】:

  • 使用这段代码和使用'session.query(SomeTable).all()'有什么区别?
  • 我相信 'User.query.all()' 使用核心。其中 'session.query(SomeTable).all()' 是 ORM
  • 注意:据我从文档中可以看出,这种语法只能使用 Flask-SQLAlchemy,不能直接使用 SQLAlchemy,后者使用 select(User) 函数
  • 当您继续执行 print(user) 时。它以<TableName primary_key> 的格式打印它。如果您想知道,我认为这可能会有所帮助。它每行访问某个列条目,您可以执行print(user.column_name)。祝你好运!
【解决方案2】:

我使用下面的 sn-p 来查看表中的所有行。使用查询查找所有行。返回的对象是类实例。它们可用于根据需要查看/编辑值:

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()

【讨论】:

    猜你喜欢
    • 2016-09-05
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 2021-05-15
    相关资源
    最近更新 更多