为什么我从带有flask(python3)的sqlite3中的字符串中获取了一个Int?

时间:2015-01-23 10:02:01

标签: python-3.x sqlite flask

我正在尝试从sqlite3获取带有flask的“用户名”和“密码”数据(使用python3.4)。数据库模式如下:

create table users (
    username string primary key,
    password string not null
);

这是我的登录代码:

@app.route('/login', methods=['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
    username = request.form['username']
    password = request.form['password']
    db = get_db()
    cur = db.execute('select username, password from users')
    for row in cur.fetchall():
        if username == row[0] and password == row[1]:
            session['logged_in'] = True
            session['username'] = username
            flash('You were logged in')
            return redirect(url_for('show_entries'))
        else:
            print(row[0]=='admin')
            print(row[1]=='123')
            print(row[1]+1)

    error = 'Invalid username or password, '+username+','+password+'.'
return render_template('login.html', error=error)

我使用username =“admin”和password =“123”进行了测试。注意三个打印代码。当我发现第二个打印返回false时,我很惊讶,第三个打印返回“124”。我无法理解为什么“row [1]”变成了Integer而不是String,因为“password”是数据库中的一个字符串。

我是python和flask的新手。我认为这是不合理的,因为我没有做任何从字符串到int的转换。我使用username =“test”和password =“test”再次测试它,效果很好。

1 个答案:

答案 0 :(得分:0)

我认为问题是string在sqlite3中实际上看起来并不是有效的列关联,您应该将这些列声明为TEXT。来自sqlite3 datatype documentation

  

声明的“STRING”类型具有NUMERIC的亲和力,而不是TEXT。

这具有以下含义(也来自相同的文档):

  

具有NUMERIC亲缘关系的列可能包含使用所有五个存储类的值。将文本数据插入NUMERIC列时,如果此类转换无损且可逆,则文本的存储类将转换为INTEGER或REAL(按优先顺序排列)。

因此,当123存储在该列中时,它将存储为整数,因为转换是可能的。当test存储在那里时,它仅作为文本存储,因为无法合理地转换为整数或实数。