Код: Выделить всё
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()
Надеюсь, я хорошо это описываю.
Это может быть связано с тем, как обрабатывается результат 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 пытается получить все комнаты, членом которых является данный пользователь:
Код: Выделить всё
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
И если комнат несколько, он печатает все комнаты, кроме первой один .
Подробнее здесь: https://stackoverflow.com/questions/790 ... from-a-pyt