Неиспользуемые имена столбцов sqlalchemy python

#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'}))