Я хочу запустить параметризованный оператор mysql UPDATE SET в flask_sqlalchemy. Поскольку я не знаю, какие столбцы нужно обновить, я написал вспомогательную функцию, которая поможет в написании оператора.
Моя модель
class User(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement= True)
username = db.Column(db.String(80), nullable=False)
email = db.Column(db.String(120), nullable=False)
def __repr__(self):
return '<User %r>' % self.username
Вспомогательная функция
def run_sql(params):
# e.g: params = {'username': "testing", "email": "testing@testing.ts", "id": 1}
id = params.pop("id")
# params = {'username': "testing", "email": "testing@testing.ts"}
sets = list(map(lambda col: f"{col}=:{col}", params.keys()))
# sets = ["username=:username", "email=:email"]
sets = ", ".join(sets)
# sets = "username=:username, email=:email"
params["id"] = id
# params = {'username': "testing", "email": "testing@testing.ts", "id": 1}
sql_statement = f"""UPDATE User SET {sets} WHERE id=:id LIMIT 1"""
# sql_statement = UPDATE User SET username=:username, email=:email WHERE id=:id LIMIT 1
return sql_statement
Вызов вспомогательной функции
if __name__ == "__main__":
conn = engine.connect()
params = {'username': "testing", "email": "testing@testing.ts", "id": 1}
sql_statement = run_sql(params)
conn.execute(sql_statement, params)
Запуск предыдущего кода приводит к следующему исключению
"sqlalchemy.exc.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 ':username, email=:email WHERE id=:id LIMIT 1' at line 1") [SQL: 'UPDATE User SET username=:username, email=:email WHERE id=:id LIMIT 1'] [parameters: {'username': 'testing', 'email': 'testing@testing.ts', 'id': 1}] (Background on this error at: http://sqlalche.me/e/f405)"
Оператор SQL выглядит хорошо для меня, поэтому параметры. Я что-то упустил?