For example im doing a query to my database
try:
dbConn = DatabasePool.getConnection()
cursor = dbConn.cursor(dictionary=True)
sqlquery = f"update table set name=%s if(name=%s is not null),description=%s if(description=%s is not null) where jsonid=%s"
cursor.execute(
sqlquery, (JSON['name'], JSON['description'], jsonid))
dbConn.commit()
rows = cursor.rowcount
return rows
finally:
dbConn.close()
if i leave the name field blank. i will still be able to update my description likewise for my name.
how do i go about it doing it with the %s
i have also tried another way
sql = f"update table set name=if(name is null, name, %s), description = if(description is null, description, %s) where jsonID=%s"
cursor.execute(
sql, (JSON['name'], JSON['description'], jsonid))
i have to provide the 2 fields, if not it will throw me an 500 internal server error if one of the field is less.
If the set of fields you're updating is variable, then you need to build your query dynamically. Note here that I add additional "SET" clauses based on which fields are present.
clauses = []
values = []
if JSON['name']:
clauses.append( 'name=%s' )
values.append( JSON['name'] )
if JSON['description']:
clauses.append( 'description=%s' )
values.append( JSON['description'] )
if values:
values.append( jsonid )
cursor = dbConn.cursor(dictionary=True)
sqlquery = "UPDATE table SET " + (','.join(clauses)) + " WHERE jsonid=%s;"
cursor.execute( sqlquery, values )
rows = cursor.rowcount
dbConn.commit()
return rows
If you have more than just these two fields, you can make it even more automated:
for column in ('name','description'):
if JSON[column]:
clauses.append( column + '=%s' )
values.append( JSON[column] )
I'm not sure why I'm still facing this error
here is the put route
@app.route('/movie/<int:movieid>', methods=['PUT'])
def updateMovie(movieid):
try:
movieJSON = request.json # body JSON data
rows = Movie.updateMovie(movieid, movieJSON)
msg = str(rows)+" row(s) updated"
output = {"message": msg}
return jsonify(output), 200
except Exception as err:
print(err)
return jsonify({}), 500
while my movie class
@classmethod
def updateMovie(cls, movieid, movieJSON):
clauses = []
values = []
if movieJSON['name']:
clauses.append('name=%s')
values.append(movieJSON['name'])
if movieJSON['description']:
clauses.append('description=%s')
values.append(movieJSON['description'])
try:
if values:
values.append(movieid)
dbConn = DatabasePool.getConnection()
cursor = dbConn.cursor(dictionary=True)
sql = "update movie set " + \
(','.join(clauses)) + " where movieID=%s"
print(sql)
print(values)
cursor.execute(sql, (values))
dbConn.commit()
rows = cursor.rowcount
return rows
finally:
dbConn.close()
the print statement which work
update movie set name=%s,description=%s where movieID=%s
['asdasd', 'asdasda123', 21]
127.0.0.1 - - [03/Feb/2022 20:20:22] "PUT /movie/21 HTTP/1.1" 200 -
if i provide 1 of the fields i get
'description'
127.0.0.1 - - [03/Feb/2022 20:14:50] "PUT /movie/21 HTTP/1.1" 500 -
or
'name'
127.0.0.1 - - [03/Feb/2022 20:25:27] "PUT /movie/21 HTTP/1.1" 500 -
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.