Ошибка типа SQLAlchemy: (‘Параметры должны быть в списке, кортеже или строке’, ‘HY000’)

#python #sql-server #sqlalchemy

#python #sql-сервер #sqlalchemy

Вопрос:

У меня есть метод, который использует sqlalchemy

     def insert_amended_values(self, data):
        insert_stmt = """INSERT INTO amended (date, volume, price, updated)
        VALUES (%(date)s, %(volume)s, %(price)s, %(updated)s);"""
        crsr = self.connection.engine.raw_connection().cursor()
        crsr.executemany(insert_stmt, data)
  

Который принимает данные, которые представляют собой список словарей, таких как

 [
    {'date': '2020-06-27', 'volume': '30', 'price': 50, 'updated': '2020-10-21 17:17:50'},
    {'date': '2020-06-28', 'volume': '32', 'price': 48, 'updated': '2020-10-21 17:17:50'},
    {'date': '2020-06-29', 'volume': '26', 'price': 56, 'updated': '2020-10-21 17:17:50'}
]
  

но я получаю сообщение об ошибке TypeError: ('Params must be in a list, tuple, or Row', 'HY000')

Как я могу преобразовать список словарей в список списков или строк, сохранив параметризованный запрос?

Спасибо

Ответ №1:

Оставьте свои данные в list of dict , оберните свой оператор SQL в text объект SQLAlchemy и используйте :name стиль параметра

 import sqlalchemy as sa

# …

    def insert_amended_values(self, data):
        insert_stmt = sa.text("""INSERT INTO amended (date, volume, price, updated)
        VALUES (:date, :volume, :price, :updated);""")
        with self.connection.engine.begin() as conn:
            conn.execute(insert_stmt, data)
  

Комментарии:

1. Спасибо. Позвольте мне попробовать это 🙂

2. Привет, есть ли способ сделать это с помощью курсора? Вставьте список словарей, который есть. Спасибо