Выполните обновление со значениями словаря / dataframe в SQLAlchemy - PullRequest
1 голос
/ 20 мая 2019

Я пытаюсь обновить user_id и date_synced в моей user_table.Я использую MySQL.Моя таблица выглядит следующим образом: User(user_id, mail, active, activity_level, date_synced). Эти значения получены из моих DataFrameUsers:

user_id date_synced
1   2019-05-20 20:48:04
8   2019-05-20 20:48:04

Преобразовано в dict с dictUsers = dfUsers.to_dict():

{'date_synced': {1: '2019-05-20 20:48:04', 8: '2019-05-20 20:48:04'}}

Когда я выполняю:

conn.execute(user_table.update(), [ 
        dictUsers
    ]
)

Я получаю сообщение об ошибке:

ProgrammingError: (pymysql.err.ProgrammingError) (1064, 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'1: "\'2019-05-20 20:48:04\'", 8: "\'2019-05-20 20:48:04\'"}\' at line 1')
[SQL: UPDATE `User` SET date_synced=%(date_synced)s]
[parameters: {'date_synced': {1: '2019-05-20 20:48:04', 8: '2019-05-20 20:48:04'}}]

Ожидаемый результат будет обновлен в базе данных.

Как вставить этот словарь с помощью SQLAlchemy?Не должен быть диктом, может быть преобразован.Я просто хочу, чтобы это сработало.Спасибо!

1 Ответ

1 голос
/ 23 мая 2019

У вас неправильный формат параметров.sqlalchemy не теперь, как искать строку и какое обновление.Правильный формат:

[
    {'user_id': 1, 'date_synced': '2019-05-20 20:48:04'},
    {'user_id': 8, 'date_synced': '2019-05-20 20:48:04'}
]

Так что вам нужно просто конвертировать dictUsers.Просто пример:

from sqlalchemy.sql.expression import bindparam, update
from sqlalchemy.sql.expression import func

data = {'date_synced': {1: '2019-05-20 20:48:05', 2: '2019-05-20 20:48:05'}}
params = []
for user_id, date_synced in data['date_synced'].items():
    params.append({'_id': user_id, 'date_synced': date_synced})

stmt = update(User).\
    where(User.user_id == bindparam('_id')).\
    values({
        'date_synced': bindparam('date_synced'),
    })

db.session.execute(stmt, params)
db.session.commit()

Надеюсь, это поможет.

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