Python SQLite3: странная проблема NoneType при выполнении запроса два раза подряд - PullRequest
0 голосов
/ 13 мая 2018

Итак, предисловие: цель состоит в том, чтобы разделить базу данных sqlite на три фрагмента с помощью кода.У меня большая часть истории хранения и доступа к базам данных, но, похоже, я столкнулся с проблемой, пытаясь запросить более одного из этих сегментов подряд, чтобы найти конкретную строку.Код, скорее всего, говорит сам за себя, поэтому, пожалуйста, посмотрите на него ниже.

def get_db():
"""Opens a new database connection if there is none yet for the
current application context.
"""
    top = _app_ctx_stack.top
    if not hasattr(top, 'sqlite_db'):
        top.sqlite_db = [ sqlite3.connect(DATABASE_1, detect_types=sqlite3.PARSE_DECLTYPES), sqlite3.connect(DATABASE_2, detect_types=sqlite3.PARSE_DECLTYPES), sqlite3.connect(DATABASE_3, detect_types=sqlite3.PARSE_DECLTYPES) ]
        top.sqlite_db[0].row_factory = sqlite3.Row
        top.sqlite_db[1].row_factory = sqlite3.Row
        top.sqlite_db[2].row_factory = sqlite3.Row
    return top.sqlite_db


def query_db(query, shard, args=(), one=False):
"""Queries the database and returns a list of dictionaries."""
    db = get_db()
    cur = db[shard].execute(query, args)
    rv = cur.fetchall()
    return (rv[0] if rv else None) if one else rv


def get_user_id(username):
"""Convenience method to look up the id for a username."""
    rb = query_db('select user_id from user where username = ?', 1, [username], one=True)
    rv = query_db('select user_id from user where username = ?', 2, [username], one=True)
    return rv[0] if rv else None


@app.teardown_appcontext
def close_database(exception):
"""Closes the database again at the end of the request."""
    top = _app_ctx_stack.top
    if hasattr(top, 'sqlite_db'):
        top.sqlite_db[0].close()
        top.sqlite_db[1].close()
        top.sqlite_db[2].close()

Я попытался включить все, что может понадобиться.get_user_id - это место, где я сталкиваюсь с проблемой;кажется, что вызовы query_db дважды в стрелке вызывают проблему ниже (кажется, что неважно, кому они назначены, поскольку он сталкивается с той же проблемой в любом случае).

TypeError: 'NoneType' object has no attribute '__getitem__'

Если я удаляю одну из строк (независимо от того, запрашивает ли он правильный шард или нет), это работает.Не имеет значения, есть ли в базе данных фактическая строка с этим именем пользователя, поскольку подтверждается, что она возвращает None, когда я удаляю одну из строк в get_user_id.Кажется, проблема возникает из-за вызова query_db дважды подряд.Это также приводит меня к мысли, что существует проблема с вызовом соединения с БД.Еще раз, я попытался включить все, что я считаю актуальным, но я могу добавить что-нибудь еще, если этого недостаточно.

РЕДАКТИРОВАТЬ 1:

Добавление полной трассировки в соответствии с запросом.

Traceback (most recent call last):
  File "/home/me/.local/bin/flask", line 9, in <module>
    load_entry_point('Flask', 'console_scripts', 'flask')()
  File "/home/me/Desktop/project/flask/flask/cli.py", line 881, in main
    cli.main(args=args, prog_name=name)
  File "/home/me/Desktop/project/flask/flask/cli.py", line 557, in main
    return super(FlaskGroup, self).main(*args, **kwargs)
  File "/home/me/.local/lib/python2.7/site-packages/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/home/me/.local/lib/python2.7/site-packages/click/core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/me/.local/lib/python2.7/site-packages/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/me/.local/lib/python2.7/site-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/home/me/.local/lib/python2.7/site-packages/click/decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/home/me/Desktop/project/flask/flask/cli.py", line 412, in decorator
    return __ctx.invoke(f, *args, **kwargs)
  File "/home/me/.local/lib/python2.7/site-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/home/me/Desktop/project/flask/examples/minitwit/minitwit/mt_api.py", line 149, in dummy_command
    dummy_db()
  File "/home/me/Desktop/project/flask/examples/minitwit/minitwit/mt_api.py", line 143, in dummy_db
    rv = get_user_id('dbrewer5')
  File "/home/me/Desktop/project/flask/examples/minitwit/minitwit/mt_api.py", line 86, in get_user_id
    rv = query_db('select user_id from user where username = ?', 2, [username], one=True)
  File "/home/me/Desktop/project/flask/examples/minitwit/minitwit/mt_api.py", line 75, in query_db
    cur = db[shard].execute(query, args)
TypeError: 'NoneType' object has no attribute '__getitem__'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...