Задать вопрос
@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`у автора сообщения
  • Вопрос задан
  • 235 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 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,)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы