Как правильно написать код с использованием Query Builder в библиотеке SQLAlchemy?

Как можно создать новые записи в базе данных с каждым уникальным автомобилем и страной, используя декартово произведение в SQL запросе? Инструкции по созданию записей с каждым уникальным значением из списка в базе данных, не загружая это в память.
  • 13 марта 2024 г. 20:39
Ответы на вопрос 2
Для создания записей в базе данных с каждым уникальным автомобилем и страной, можно использовать Query Builder в библиотеке SQLAlchemy следующим образом:

```python
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
from sqlalchemy.sql import select
from sqlalchemy.sql.expression import func

engine = create_engine('sqlite:///test.db')

metadata = MetaData()

cars_table = Table('cars', metadata,
                   Column('id', Integer, primary_key=True),
                   Column('car_name', String),
                   Column('country', String)
                   )

metadata.create_all(engine)

car_names = ['Toyota', 'Honda', 'Ford']
countries = ['Japan', 'USA', 'Germany']

with engine.connect() as connection:
    stmt = cars_table.insert().from_select(['car_name', 'country'],
                                           select([func.unnest(car_names), func.unnest(countries)]))
    connection.execute(stmt)
```

Этот код создаст новые записи в таблице "cars" с каждым уникальным автомобилем и страной, используя декартово произведение в SQL запросе.

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

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

```python
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String

engine = create_engine('sqlite:///test.db')
metadata = MetaData()

cars_table = Table('cars', metadata,
                   Column('id', Integer, primary_key=True),
                   Column('car_name', String)
                   )

metadata.create_all(engine)

car_names = ['Toyota', 'Honda', 'Ford']

with engine.connect() as connection:
    for car_name in car_names:
        stmt = cars_table.insert().values(car_name=car_name)
        connection.execute(stmt)
```

В этом примере будет создана запись для каждого уникального значения из списка "car_names" в базе данных, без загрузки всего списка в память.
Совершенно непонятно, что вы хотите этим получить. 
Ошибки в вашем запросе:
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;

4) Проверяйте, работает ли у вас SELECT (без INSERT).
3) Если SELECT работает, а INSERT нет, смотрите, какой PK у вашей таблицы my_table? Возможно, пытаясь вставить полученные в SELECT данные, вы получите нарушение уникальности.
В целом смысл манипуляций мне не понятен.
Похожие вопросы