为什么我用 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
存储在那里时,它仅作为文本存储,因为无法合理地转换为整数或实数。
我正在尝试使用 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
存储在那里时,它仅作为文本存储,因为无法合理地转换为整数或实数。