求助web.py查询mysql,获得最新注册用户头像的问题。 - V2EX
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
paloalto
V2EX    Python

求助web.py查询mysql,获得最新注册用户头像的问题。

  •  
  •   paloalto 2012-08-01 19:15:53 +08:00 4553 次点击
    这是一个创建于 4893 天前的主题,其中的信息可能已经有所发展或是发生改变。
    零基础,遇到一个技术问题,不会写了.....

    mysql数据库中有一张users表,存了userID,username,nickname,email,password等注册信息;还有一张profile表,目前只存了userID和avatar_path两个字段。

    现在有一个页面,需要列出最新注册的10个用户的 昵称(nickname)和 头像(avatar_path).

    我的思路是这样:

    1:先得到最后注册的10个用户(model部分的代码如下):

    #users.py#
    def last_users():
    return db.select('users', limit = 10, order='id DESC')

    这样,controller部分就可以把last_users传给view,view可以获得用户的昵称(nickname)了:

    #explore.py#
    class explore:
    def GET(self):
    last_users = users.last_users()
    return view.base(view.explore(last_users), user, siteName)

    #explore.html#
    $def with (last_users)

    <h1>Explore</h1>
    <ul>
    $for user in last_users
    <li> $user.nickname </li>
    </ul>

    但是接下来取得用户头像就有点难了,我觉得首先需要获得最新注册的10个用户的userID,但我只会在view里$user.id。尝试在model部分得到userID吧:

    #在users.py里加了以下代码#

    def get_last_users_id():
    ids = web.listget(last_users(), 0, {})
    return ids.get('userID', False)

    上面这段代码只能得到最后注册的那一个用户的userID,因为.listget()里有一个参数为0,是取最后1个的。我郁闷半天,尝试去掉0、尝试改0为all,以得到全部的userID,结果报错说必须得有这么个参数。我不知道怎么才能获得这10个用户的userID。

    我是想获得了这10个用户的userID后,就可以把它们传给下面的get_avatar()去获取头像,但是这里我也不知道怎么处理了,我也没写过传一串userID去查询数据的经验,也许需要写个for循环什么的?

    def get_avatar_by_id(userID): #得到用户头像
    return web.listget(
    db.select('userProfile', vars=dict(id=userID),
    where='id = $id'), 0, {})
    def get_avatar(userID):
    avatar = get_avatar_by_id(userID)
    return avatar.get('avatarPath', False)



    请程序员们支招。。。
    6 条回复    1970-01-01 08:00:00 +08:00
    aggron
        1
    aggron  
       2012-08-02 10:26:09 +08:00   1
    返回多条数据时,用连接查询一次性返回结果集比较好吧, users和profile表~

    db.select(['users', 'profile'], where="users.id=profile.userID", limit = 10, order='id DESC')
    paloalto
        2
    paloalto  
    OP
       2012-08-02 23:47:00 +08:00
    @aggron 多谢解答!

    刚才执行时发现报错,是因为后面的order='id DESC'没有指明是用哪个表的id,改为

    db.select(['users', 'profile'], where="users.id=profile.userID", limit = 10, order='users.id DESC')

    这样就行啦!


    另外请问如果数据为空的话,db.select()能像web.listget()或者xxx.get()一样指定一个返回的数值吗?如下:

    web.listget(
    db.select('users', vars=dict(username=username),
    where='username = $username'), 0, {'为空时返回的东西'})


    return ids.get('id', False) False 也是为空时返回的。

    还是说db.select()需要手动去判断返回的值是否为空?
    aggron
        3
    aggron  
       2012-08-03 11:10:56 +08:00
    web.py的db api好像不能指定默认值,
    你是指某个字段为空返回默认值吗,从mysql层面是可以用ifnull的
    what="users.*, ifnull(avatarPath,'[email protected]')"
    db.select(['users', 'profile'], what=what, where="users.id=profile.userID", limit = 10, order='users.id DESC')
    加入what有个麻烦就是,如果要指定users表中的某个字段默认值,就不能使用通配符*了
    what="username,id,nick_name,......",
    ps:在sql中通常不使用select * from之类的通配符*,需要哪些字段就select 字段名,从这个编程习惯来说,也算个强制约束了。。
    memorybox
        4
    memorybox  
       2012-08-03 13:13:05 +08:00
    @paloalto
    web.py的db返回形式是[[{'a':'a'},{'b':'b'},{'c':'c'}...], [...]]这样的,如果没有查到记录,那默认就是[]了,我记得以前是这么用的,现在你可以查查手册。
    我以前是用
    res = db.select(...).list()
    try:
    return res[0]['a']
    except:
    #为空的处理

    用ids.get(...)也可以,不知道有没有更好的方法。
    ps:因为数据是直接传到模板里,我觉得在模板里也要对数据为空的时候做一下判断。
    parkman
        5
    parkman  
       2012-08-09 11:34:53 +08:00
    sqlalchemy还是比较好用 在web.py里面import一下import sqlalchemy。
    ipconfiger
        6
    ipconfiger  
       2012-08-09 11:51:18 +08:00
    sqlalchemy在建了一大堆关联后删数据才叫一个痛苦哦
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4307 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 01:02 PVG 09:02 LAX 17:02 JFK 20:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86