V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
dizzy
V2EX  ›  Python

请问下大家,有关 flask-sqlalchemy query 返回的问题。

  •  
  •   dizzy · 2015-06-01 21:12:31 +08:00 · 7517 次点击
    这是一个创建于 3454 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好,我在flask项目里面用flask-sqlalchemy的时候,遇到了查询不出结果的问题,于是我按照文档写了一个简单的程序验证,还是同样的问题,具体如下:
    test.py:

    from flask import Flask
    from flask.ext.sqlalchemy import SQLAlchemy

    app = Flask(name)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
    db = SQLAlchemy(app)

    class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email
    

    我在命令行中提交:

    from test import db, User
    db.create_all()
    admin = User('admin', '[email protected]')
    guest = User('guest', '[email protected]')
    db.session.add(admin)
    db.session.add(guest)
    db.session.commit()
    User.query.all()
    本来应该返回一个包含结果的列表,但是返回的确实对象:
    [<test.User object at 0x7fc61b357490>, <test.User object at 0x7fc61af1c810>]
    之后我各种google未果,stackoverflow上面搜索也未果。请问下大家,我这里到底是哪出问题?谢谢。

    10 条回复    2015-06-02 19:11:03 +08:00
    billlee
        1
    billlee  
       2015-06-01 21:33:54 +08:00   ❤️ 1
    这个不就是包含结果(两个 test.User 实例)的列表吗?
    dizzy
        2
    dizzy  
    OP
       2015-06-01 21:35:48 +08:00
    @billlee 请问怎样才能查询出结果?
    dizzy
        3
    dizzy  
    OP
       2015-06-01 21:40:54 +08:00
    @billlee 我的意思是,按照文档中的描述,结果应该是[<User u'admin'>, <User u'guest'>]这样的。
    jas0ndyq
        4
    jas0ndyq  
       2015-06-01 21:46:30 +08:00   ❤️ 1
    i循环进去i.username
    dizzy
        5
    dizzy  
    OP
       2015-06-01 21:57:34 +08:00
    @jas0ndyq 谢谢。
    awanabe
        6
    awanabe  
       2015-06-01 22:45:59 +08:00   ❤️ 1
    @dizzy
    class User 中增加一个 __repr__ 方法.
    你想要的结果 return '<User %s>' % self. username
    如果没有这个方法..就会打出 对象地址.
    这个就是类似于Java中的toString方法
    powergx
        7
    powergx  
       2015-06-01 22:47:13 +08:00   ❤️ 1
    user class 又没有写 def __repr__ , 打印出来当然没有内容了

    下面代码放进 user class 就能正确显示了
    def __repr__(self):
    return '%s (%r, %r,%r)' % (
    self.__class__.__name__, self.id, self.username,self. email)
    awanabe
        8
    awanabe  
       2015-06-01 22:47:19 +08:00   ❤️ 1
    @dizzy 你还可以试试 __str__() 这个方法...
    去了解下 __str__() 和 __repr__() 的不同
    dizzy
        9
    dizzy  
    OP
       2015-06-01 23:49:30 +08:00
    @powergx
    @awanabe 原来是这样,我之前也去了解过这两个方法,当时我以为只是测试的时候用。谢谢你们的解答。
    elvis_w
        10
    elvis_w  
       2015-06-02 19:11:03 +08:00   ❤️ 1
    @dizzy 本来就是测试用的,实际在使用当中应该用遍历器遍历的
    user = User.query.all()
    for u in users:
    ... print u.id,u.nickname,u.email
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5642 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:36 · PVG 11:36 · LAX 19:36 · JFK 22:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.