Почему первый результат пропускается при выполнении запроса SQLite из кода Python?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему первый результат пропускается при выполнении запроса SQLite из кода Python?

Сообщение Anonymous »

Первый результат пропускается при выполнении запроса из кода Python.

Код: Выделить всё

rooms = cur2.execute("SELECT r.* FROM rooms r JOIN room_members rm ON r.id = rm.room_id JOIN users u ON u.id = rm.user_id WHERE u.username = ?;",(usr,)).fetchall()
Я хочу получить все комнаты, частью которых является этот пользователь, room_members, играющие отношения «многие ко многим», но по какой-то причине, если результатом является одна комната, он возвращает None therooms var пуст, и если комнат больше одной, она пропускает первую и возвращает остальные. но если я запускаю запрос в оболочке SQL, он работает нормально и показывает правильные результаты.
Надеюсь, я хорошо это описываю.
Это может быть связано с тем, как обрабатывается результат fetchall(), или может возникнуть проблема с обработкой подключения к базе данных или курсора. поэтому я попробовал fetchone(), удалив sqlite3.Row, обеспечив согласованность типов данных, изменив курсор на

Код: Выделить всё

rooms = cur.execute('''
SELECT r.*
FROM rooms r
JOIN room_members rm ON r.id = rm.room_id
JOIN users u ON u.id = rm.user_id
WHERE u.username = ?;
''', (usr,)).fetchall()
Я не могу понять, что вызывает эту проблему.
ВОТ минимальный воспроизводимый пример.
Мы используем три таблицы:rooms,users иroom_members (таблица отношений «многие-ко-многим» между комнатами и пользователями).
sql

Код: Выделить всё

-- Table to store room information
CREATE TABLE IF NOT EXISTS rooms (
id INTEGER PRIMARY KEY AUTOINCREMENT,
token TEXT NOT NULL UNIQUE
);

-- Table to store user information
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE
);

-- Table to link users to rooms (many-to-many relationship)
CREATE TABLE IF NOT EXISTS room_members (
id INTEGER PRIMARY KEY AUTOINCREMENT,
room_id INTEGER,
user_id INTEGER,
FOREIGN KEY (room_id) REFERENCES rooms (id),
FOREIGN KEY (user_id) REFERENCES users (id)
);
Наполнение базы данных:
Предположим, что база данных содержит следующие данные:

Код: Выделить всё

One user: test_user
One room: ROOM123
test_user is a member of ROOM123
Эти данные можно вставить следующим образом:

Код: Выделить всё

INSERT INTO users (username) VALUES ('test_user');
INSERT INTO rooms (token) VALUES ('ROOM123');
INSERT INTO room_members (room_id, user_id)
VALUES ((SELECT id FROM rooms WHERE token = 'ROOM123'), (SELECT id FROM users WHERE username = 'test_user'));
Код Python:
Следующий код Python пытается получить все комнаты, членом которых является данный пользователь:

Код: Выделить всё

import sqlite3

DATABASE = 'chatlap.db'

def create_connection():
conn = sqlite3.connect(DATABASE)
conn.row_factory = sqlite3.Row  # This ensures results are returned as dictionaries
return conn

def get_rooms_for_user(usr):
conn = create_connection()
cur = conn.cursor()

# Check if the user exists
user = cur.execute('SELECT * FROM users WHERE username = ?', (usr,)).fetchone()

if not user:
print(f"User {usr} does not exist.")
conn.close()
return None

# Fetch all rooms that the user is part of
rooms = cur.execute('''
SELECT r.*
FROM rooms r
JOIN room_members rm ON r.id = rm.room_id
JOIN users u ON u.id = rm.user_id
WHERE u.username = ?;
''', (usr,)).fetchall()

conn.close()

if rooms:
rooms = [dict(row) for row in rooms]
print(f"Rooms found for user {usr}: {rooms}")
else:
print(f"No rooms found for user {usr}")

return rooms

# Testing with a user that should exist
get_rooms_for_user('test_user')
Ожидаемое поведение:
При запуске кода он должен возвращать комнаты, связанные с test_user.
Ожидаемый результат:

Код: Выделить всё

Rooms found for user test_user: [{'id': 1, 'token': 'ROOM123'}]
Фактическое поведение:
Функция печатает:

Код: Выделить всё

No rooms found for user test_user
Несмотря на то, что выполнение того же запроса в оболочке SQLite дает правильный результат.
И если комнат несколько, он печатает все комнаты, кроме первой один .

Подробнее здесь: https://stackoverflow.com/questions/790 ... from-a-pyt
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»