@ztx511

Как взять данные с двух таблиц?

Вообщем мне надо взять данные с двух таблиц ниже код

cursor.execute("""CREATE TABLE IF NOT EXISTS users (
                id TEXT,
                cash BIGINT,
)""")
    conn.commit()

    cursor.execute("""CREATE TABLE IF NOT EXISTS cars (
                id2 TEXT,
                honda INT,
)""")
    conn.commit()
#допустим это мы создали две таблицы с столбцами cash, honda
@client.command()


async def test(ctx):
    for row in cursor.execute(f'SELECT cash, honda FROM users, cars WHERE id = id2 = {ctx.author.id}')
    print(row)


#и тут нам надо взять из двух таблиц cash и honda но при это нам надо чтобы ихнии id`и были одинаковые и равнялись при это id`у автора сообщения
  • Вопрос задан
  • 210 просмотров
Решения вопроса 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
Условие id=id2=ctx.author.id в зависимости от используемой базы может иметь как непредсказуемый эффект, так и вообще возвращать ошибку, потому что id=id2 возвращает булевое значение (true или false), которое затем сравнивается с ctx.author.id, что явно не планировалось. Вместо этого надо сделать два условия: id=id2 AND id=ctx.author.id. А ещё лучше переместить id=id2 в условие JOIN (таблица1 JOIN таблица2 ON условие)

Далее, при работе с базой лучше использовать строки с плейсхолдерами, к этому следует приучать себя заранее, чтобы избегать рисков SQL-инъекций:

cursor.execute("SELECT * FROM cars WHERE user_id=?", (current_user_id,))


(В зависимости от базы данных плейсхолдер может быть не ?, как в sqlite3, а %s или что-то ещё)

Далее, следует разумно выбирать имена полей в таблицах, чтобы их назначение было более понятным, а то что это за id и id2? Например:

users:
- id: id пользователя
- name: имя пользователя
- birth_date: дата рождения

cars:
- id: id автомобиля
- owner_id: id пользователя-владельца (из таблицы users)
- reg_number: гос. регистрационный номер
- model: модель автомобиля

Например, при такой структуре данных можно получить список автомобилей пользователя таким запросом

cursor.execute("SELECT users.id AS user_id, users.name, cars.id AS car_id, cars.model FROM users JOIN cars ON users.id=cars.owner_id WHERE users.id=?", (ctx.author.id,))


Запись (ctx.author.id,) с запятой в скобках нужна для того, чтобы вместо одного значения в функцию был передан tuple из одного значения. В python (1,2,3) означет tuple из трёх значений, но с одним значением такой синтаксис не прокатывает, (1) даёт то же, что и просто 1 без скобок, чтобы это обойти, надо поставить запятую (1,)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
22 мая 2024, в 10:10
1500 руб./в час
22 мая 2024, в 10:07
25000 руб./за проект
22 мая 2024, в 10:04
2000 руб./за проект