Как правильно сформировать Query Builder код в SQLALCHEMY?
Есть RAW SQL:
INSERT INTO my_table(id, username, country, age, is_car_owner, car) SELECT 15 as id, 'daniel' as username, country_list.country, 18 as age, True as is_car_owner, cars_list.car FROM (SELECT DISTINCT car from mytable) as cars_list) CROSS JOIN (SELECT DISTINCT country from mytable) as country_list; |
INSERT INTO my_table(id, username, country, age, is_car_owner, car) SELECT 15 as id, 'daniel' as username, country_list.country, 18 as age, True as is_car_owner, cars_list.car FROM (SELECT DISTINCT car from mytable) as cars_list) CROSS JOIN (SELECT DISTINCT country from mytable) as country_list;
Суть в том, чтобы занести в бд декартово произведение новой записи с каждой страной или автомобилем. Потратил много времени, но у меня не получается, chatGPT не помог, постоянно делает ошибки, в гугле тоже нет прямого ответа.
Пример: в бд, в конкретной таблице есть записи с разными cars. например, audi, bmw, mersedes, hyundai. Необходимо создать 4 записи с вышеуказанными полями, где в каждой будет одно из значений - audi, bmw и др.
Хочу решить эту проблему собрав все записи уже на стороне бд, а не в памяти.
Дополнительно:
при чём тут тег FastAPI?
Потратил много времени, но у меня не получается, chatGPT не помог, постоянно делает ошибки, в гугле тоже нет прямого ответа
Показывайте, что пробовали и где именно ошибки.
Ответы:
Совершенно непонятно, что вы хотите этим получить.
Ошибки в вашем запросе:
1) лишняя скобка после "as cars_list"
2) SELECT DISTINCT car from mytable - что это за mytable? это та же таблица my_table с ошибкой?
Если да, то запрос должен выглядеть так:
INSERT INTO my_table(id, username, country, age, is_car_owner, car) SELECT 15 as id, 'daniel' as username, country_list.country, 18 as age, True as is_car_owner, cars_list.car FROM (SELECT DISTINCT car from my_table) as cars_list CROSS JOIN (SELECT DISTINCT country from my_table) as country_list; |
INSERT INTO my_table(id, username, country, age, is_car_owner, car) SELECT 15 as id, 'daniel' as username, country_list.country, 18 as age, True as is_car_owner, cars_list.car FROM (SELECT DISTINCT car from my_table) as cars_list CROSS JOIN (SELECT DISTINCT country from my_table) as country_list;
4) Проверяйте, работает ли у вас SELECT (без INSERT).
3) Если SELECT работает, а INSERT нет, смотрите, какой PK у вашей таблицы my_table? Возможно, пытаясь вставить полученные в SELECT данные, вы получите нарушение уникальности.
В целом смысл манипуляций мне не понятен.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для правильного формирования Query Builder кода в SQLALCHEMY, необходимо следовать определенным шагам и правилам. SQLALCHEMY - это популярный инструмент для работы с базами данных в языке Python, который облегчает выполнение запросов к базе данных.
1. Импорт необходимых модулей:
Для начала работы с SQLALCHEMY необходимо импортировать необходимые модули. Обычно это делается следующим образом:
from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String
2. Создание модели данных:
Определите модель данных, которая будет соответствовать вашей таблице в базе данных. Например, если у вас есть таблица "users", то модель данных может выглядеть следующим образом:
Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) age = Column(Integer)
3. Создание объекта сессии:
Для выполнения запросов к базе данных необходимо создать объект сессии:
engine = create_engine('sqlite:///example.db', echo=True) # замените на свой путь к базе данных Session = sessionmaker(bind=engine) session = Session()
4. Формирование запроса с использованием Query Builder:
Теперь, когда у вас есть модель данных и объект сессии, вы можете использовать Query Builder для формирования запросов к базе данных. Например, чтобы выбрать всех пользователей старше 18 лет, можно использовать следующий код:
users = session.query(User).filter(User.age > 18).all() for user in users: print(user.name)
Это лишь простой пример использования Query Builder в SQLALCHEMY. В зависимости от вашего запроса, вам могут потребоваться дополнительные методы и операторы. Важно помнить, что использование Query Builder позволяет избежать проблем с безопасностью и сделать ваш код более читаемым и удобным для поддержки.