python数据库应用程序尝试除块

时间:2017-06-03 10:17:55

标签: python sql postgresql

这是与postresql中的数据库交互的应用程序中的登录功能。我是python的新手,目前正在执行except块中的两个print语句。 错误在于:cur.execute(mtype,(member_id,))任何关于为什么非常赞赏的想法。

def check_login(member_id, password):

    conn = database_connect()
    if(conn is None):
        return None
    cur = conn.cursor()
    try:
        mtype = """SELECT 'athlete' FROM athlete
                        WHERE member_id=%s
                        UNION
                        SELECT 'official' FROM official
                        WHERE member_id=%s
                        UNION
                        SELECT 'staff' FROM staff
                        WHERE member_id=%s"""
        cur.execute(mtype, (member_id, ))
        user_type = cur.fetchone()
    except:
        print("Error retrieving member type")


    try:
        sql = """SELECT member_id, title, given_names AS first_name, family_name, country_name, place_name AS residence
                 FROM public.country JOIN public.member USING (country_code) JOIN public.place ON (accommodation = place_id)
                 WHERE member_id=%s AND pass_word=%s"""

        cur.execute(sql, (member_id, password))
        user_data = cur.fetchone()

        tuples = {
            'member_id': user_data[0],
            'title': user_data[1],
            'first_name': user_data[2],
            'family_name': user_data[3],
            'country_name': user_data[4],
            'residence': user_data[5],
            'member_type': user_type[0]
        }
        cur.close()
        conn.close()
        return tuples
    except:
        print("Error Invalid Login")
        cur.close()
        conn.close()
        return None

2 个答案:

答案 0 :(得分:1)

你的初始mtype赋值中有多个%s,但你的execute只提供一个参数的元组。这将失败。这可以通过在execute

中提供正确数量的参数来解决
mtype = """SELECT... member_id=%s UNION ... member_id=%s UNION ... member_id=%s"""
cur.execute(mtype, (member_id, member_id, member_id))

当然,代码中可能还有其他错误:一个人不应该盲目地捕获异常,除非你真的不关心错误是什么。

答案 1 :(得分:0)

我没有足够的积分发表评论。所以发帖在这里。只是说哪一行产生错误并没有给出很多关于问题的见解。我的建议是要么你打印出错误是什么,要么你不知道怎么做,删除第一次尝试捕获并看看产生的错误是什么。如果你发帖说人们可以帮你解决它。