为什么我用 flask (python3) 从 sqlite3 中的字符串中得到一个 Int?

Why I got a Int from a string in sqlite3 with flask (python3)?

我正在尝试使用 flask(使用 python3.4)从 sqlite3 获取 "username" 和 "password" 数据。数据库模式是这样的:

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)

我使用用户名="admin" 和密码=123 对其进行了测试。注意那三个打印代码。当我发现第二个打印 return 错误,第三个是“124”时,我感到非常惊讶。我不明白为什么 "row[1]" 变成整数而不是字符串,因为 "password" 是数据库中的字符串。

我是python和flask的新手。我认为这是不合理的,因为我没有做任何从字符串到整数的翻译。我再次使用 username="test" 和 password="test" 对其进行了测试,它运行良好。

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

And the declared type of "STRING" has an affinity of NUMERIC, not TEXT.

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

A column with NUMERIC affinity may contain values using all five storage classes. When text data is inserted into a NUMERIC column, the storage class of the text is converted to INTEGER or REAL (in order of preference) if such conversion is lossless and reversible.

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