Почему первый результат пропускается при выполнении запроса 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

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