#python #sqlalchemy
#python #sqlalchemy
Вопрос:
Я сталкиваюсь со следующей ошибкой при использовании SQLAlchemy: Unconsumed column names: company
Я хочу вставить данные для 1 определенного столбца, а не для всех столбцов в таблице: INSERT INTO customers (company) VALUES ('sample name');
Мой код:
engine.execute(table('customers').insert().values({'company': 'sample name'}))
Создать таблицу:
'CREATE TABLE `customers` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`company` varchar(255) DEFAULT NULL,
`first_name` varchar(255) DEFAULT NULL,
`last_name` varchar(255) DEFAULT NULL,
`phone` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`),
UNIQUE KEY `company_UNIQUE` (`company`)
) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8'
Комментарии:
1. Вы уверены, что у вас есть такой столбец в вашей таблице?
2. @GProst уверен на 100%
3. даже тестирование инструкции перед выполнением выдает ту же ошибку: print(table(‘customers’).insert().values({‘company’: ‘sample’}))
4. Вы уверены, что подключаетесь к той же БД? Можете ли вы выполнить какой-либо другой запрос, чтобы получить некоторые записи, например?
5. да, весь этот дизайн основан на приложении flask api, которое я создаю. У меня есть множество других операторов, которые работают нормально, включая обновления, выбор, удаление.@ GProst
Ответ №1:
После нескольких часов разочарования я смог протестировать способ, который, по моему мнению, подходит для моего варианта использования. Как мы знаем, вы можете вставлять в определенные столбцы или во все столбцы таблицы. В моем случае мне нужно динамически вставлять в таблицу customers, в зависимости от того, в какие столбцы пользователь имеет права на вставку.
Я обнаружил, что мне нужно определить все столбцы в table()
методе sqlalchemy, но я могу динамически передавать в метод любые столбцы и значения, которые мне нужны values()
.
Окончательный код:
engine.execute(table('customers', column('company'), column('first_name'), column('last_name'), column('email'), column('phone')).insert().values({'company': 'sample name'}))
Ответ №2:
Оригинальное решение отлично работает, однако я хотел бы добавить другой подход, который позволит динамически работать с таблицами, не указывая все их столбцы. Это может быть полезно при работе с несколькими таблицами.
Мы можем использовать Table
класс from sqlalchemy.schema
и предоставить наш engine
для его autoload_with
параметра, который будет отражать схему и заполнять столбцы для нас.
Затем мы можем работать так же, как и в ответе OP.
from sqlalchemy.schema import Table, MetaData
my_table_name = 'customers' # Could be passed as an argument as well :)
table = Table(my_table_name, MetaData(), autoload_with=engine)
engine.execute(my_table.insert({'company': 'sample name'}))