Другая причина, по которой вы можете получить «TypeError: объект str» не вызывается »после INSERT INTO table [Python] [Flask] [sqlite3] - PullRequest
0 голосов
/ 13 июня 2018

Я использую:

  • Колбу 0.12.2
  • Питон 3.6.1

Для подключения к моей базе данных я использую следующий фрагмент кода из Использование SQLite 3 с документом Flask :

import sqlite3
from flask import g

DATABASE = '/path/to/database.db'

def get_db():
    db = getattr(g, '_database', None)
    if db is None:
    db = g._database = sqlite3.connect(DATABASE)
    return db

@app.teardown_appcontext
def close_connection(exception):
    db = getattr(g, '_database', None)
    if db is not None:
        db.close()

и после выполнения следующего фрагмента кода:

cursor = get_db().cursor()

hashed_password = werkzeug.security.generate_password_hash(request.form['password'], method='pbkdf2:sha512', salt_length=25)
activation_token = werkzeug.security.generate_password_hash(request.form['login'], method='pbkdf2:sha512', salt_length=25)

cursor.execute('INSERT INTO Users (activation_token, login, email, password, name) VALUES (?, ?, ?, ?, ?)' (activation_token, request.form['login'], request.form['email'], hashed_password, request.form['name']))

cursor.close()
close_connection(None)

Я получаю:

File "path/to/my_file.py", line 33, in register
cursor.execute('INSERT INTO Users (activation_token, login, email, password, name) VALUES (?, ?, ?, ?, ?)' (activation_token, request.form['login'], request.form['email'], hashed_password, request.form['name']))
TypeError: 'str' object is not callable

В чем здесь ошибка?Я чувствую, что это должно быть какой-то тривиальной вещью, хотя я не был в состоянии определить это.Что добавляет путаницу - SELECT запросы в других местах моего кода работают просто отлично.

1 Ответ

0 голосов
/ 13 июня 2018

Разобрался сам, при составлении вопроса =).Отредактировал название вопроса соответственно.

Виновник оказался пропущенным через запятую между аргументами cursor.execute() (довольно тривиально, как я и ожидал).

Итак, строка:

cursor.execute('INSERT INTO Users (activation_token, login, email, password, name) VALUES (?, ?, ?, ?, ?)' (activation_token, request.form['login'], request.form['email'], hashed_password, request.form['name']))

должно быть:

cursor.execute('INSERT INTO Users (activation_token, login, email, password, name) VALUES (?, ?, ?, ?, ?)', (activation_token, request.form['login'], request.form['email'], hashed_password, request.form['name']))

Я также узнал от этого ответа , что для того, чтобы INSERT действительно произошло, connection.commit() долженвызываться после cursor.execute('INSERT ...') (один или несколько).

Таким образом, окончательный (исправленный) код должен выглядеть примерно так:

db_connection = get_db()
cursor = db_connection.cursor()

hashed_password = werkzeug.security.generate_password_hash(request.form['password'], method='pbkdf2:sha512', salt_length=25) 
activation_token = werkzeug.security.generate_password_hash(request.form['login'], method='pbkdf2:sha512', salt_length=25)

cursor.execute('INSERT INTO Users (activation_token, login, email, password, name) VALUES (?, ?, ?, ?, ?)', (activation_token, request.form['login'], request.form['email'], hashed_password, request.form['name']))
db_connection.commit()

cursor.close()
close_connection(None)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...