I am trying to insert the bytes in BLOB Type column in Python using pymysql.
The requirement is the byte should not be encoded when inserting.
My SQL looks like as follows when executing:
insert into product values(b'<\xf0Q,\x18\x99y\x86\xda\x81\xc8\x869Q\xf8\xc9\xb2\xc6NqG\xcfV\xbf{\x86\xf8\nJ\x0b\xfa)');
Getting the following error while trying to insert.
cursor.execute(sql)
File "home/.pyenv/versions/3.7.7/lib/python3.7/site-packages/pymysql/cursors.py", line 148, in execute
result = self._query(query)
File "home/.pyenv/versions/3.7.7/lib/python3.7/site-packages/pymysql/cursors.py", line 310, in _query
conn.query(q)
File "home/.pyenv/versions/3.7.7/lib/python3.7/site-packages/pymysql/connections.py", line 548, in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
File "home/.pyenv/versions/3.7.7/lib/python3.7/site-packages/pymysql/connections.py", line 775, in _read_query_result
result.read()
File "home/.pyenv/versions/3.7.7/lib/python3.7/site-packages/pymysql/connections.py", line 1156, in read
first_packet = self.connection._read_packet()
File "home/.pyenv/versions/3.7.7/lib/python3.7/site-packages/pymysql/connections.py", line 725, in _read_packet
packet.raise_for_error()
File "home/.pyenv/versions/3.7.7/lib/python3.7/site-packages/pymysql/protocol.py", line 221, in raise_for_error
err.raise_mysql_exception(self._data)
File "home/.pyenv/versions/3.7.7/lib/python3.7/site-packages/pymysql/err.py", line 143, in raise_mysql_exception
raise errorclass(errno, errval)
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 'b'<\\xf0Q,\\x18\\x99y\\x86\\xda\\x81\\xc8\\x869Q\\xf8\\xc9\\xb2\\xc6NqG\\xcfV\\xbf{\\x86\\xf8\\nJ' at line 1")
CodePudding user response:
If you use parameter substitution pymysql will handle the bytes correctly.
>>> import pymysql
>>> conn = pymysql.connect(database='test')
>>> cur = conn.cursor()
>>> cur.execute("""CREATE TABLE t70182867 (id int not null auto_increment, data blob, primary key(id))""")
0
>>> bs = b'<\xf0Q,\x18\x99y\x86\xda\x81\xc8\x869Q\xf8\xc9\xb2\xc6NqG\xcfV\xbf{\x86\xf8\nJ\x0b\xfa)'
>>> sql = """INSERT INTO t70182867 (data) VALUES (%s)"""
>>> cur.execute(sql, (bs,)) # <= let pymysql handle the values
1
>>> conn.commit()
>>> cur.execute("""SELECT data FROM t70182867""")
1
>>> cur.fetchone()
(b'<\xf0Q,\x18\x99y\x86\xda\x81\xc8\x869Q\xf8\xc9\xb2\xc6NqG\xcfV\xbf{\x86\xf8\nJ\x0b\xfa)',)
>>>
