<div dir="ltr">(apologies if you get this twice, I sent it from the wrong email the first time and assume the mailing list server rejected the message)<br><div class="gmail_quote"><div dir="ltr"><br></div><div dir="ltr">I have encountered two bugs using PyQt5.QtSql.QSqlQuery:<div><br></div><div><b>PyQt Version: </b>PyQt 5.6.dev1604021410</div><div><b>Python Version:</b> 3.4.3</div><div><br></div><div><b>Bug #1: python "bytes" data type does not insert into database</b></div><div>If I insert a byte array, the SQLite column contains no data, but I can convert that data to a string and insert it as expected.</div><div><b><br></b></div><div><b>Bug #2: QSqlQuery.exec() cannot be used with a prepared query</b></div><div>Not certain if this is a bug or if it is expected behavior.  QSqlQuery.exec() can only be called with an SQL string as input.  For a prepared query, I must instead use QSqlQuery.exec_(). However, exec_() can be used for either prepared queries or direct sql strings.</div><div><br></div><div>Example code:</div><div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace"><div>from PyQt5 import QtSql</div></font></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace"><div>db = QtSql.QSqlDatabase.addDatabase("QSQLITE")</div></font></div><div><font face="monospace, monospace"><div>db.setDatabaseName("file.sqlite3")</div></font></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace"><div>db.open()</div></font></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace"><div>query = QtSql.QSqlQuery(db)</div></font></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace"><div>query.exec("CREATE TABLE myTable( id INTEGER PRIMARY KEY, myValue BLOB );")</div><div><br></div></font></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace"><div style="background-color:rgb(255,255,0)">data = b'\x01\x02\x03\x04'</div></font></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace"><div><br></div></font></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><span style="font-family:monospace,monospace;background-color:rgb(0,255,255)"># Insert data as <b>bytes</b> object: insert fails</span></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><span style="font-family:monospace,monospace">sql = "INSERT INTO myTable (id, myValue) VALUES (1, :myValue);"</span><br></div><div><font face="monospace, monospace">query.prepare(sql)</font></div><div><font face="monospace, monospace">query.bindValue(":myValue", <span style="background-color:rgb(255,255,0)">data</span>)</font></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace" style="background-color:rgb(0,255,255)"># query.exec() <<< this fails, "not enough arguments"</font></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace">query.exec_()</font></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace" style="background-color:rgb(0,255,255)"># ^^^^^^^^^^^ Why is exec_() needed, not exec()?</font></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><span style="font-family:monospace,monospace">query.exec("SELECT * FROM myTable WHERE id = 1")</span><br></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><font face="monospace, monospace">query.first()<br>print(query.value(0), ':', query.value(1))<br><span style="background-color:rgb(0,255,255)"># 1 : <br></span><br></font><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><span style="font-family:monospace,monospace;background-color:rgb(0,255,255)"># Add BINARY flag: Insert fails</span><br><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><span style="font-family:monospace,monospace">sql = "INSERT INTO myTable (id, myValue) VALUES (2, :myValue);"</span><br><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><span style="font-family:monospace,monospace">query.prepare(sql)</span><br><span style="font-family:monospace,monospace">query.bindValue(":myValue",</span><span style="font-family:monospace,monospace"> </span><b style="font-family:monospace,monospace;background-color:rgb(255,255,0)">data, <a href="http://QtSql.QSql.In" target="_blank">QtSql.QSql.In</a> | QtSQl.QSql.Binary</b><span style="font-family:monospace,monospace">)</span><br><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><span style="font-family:monospace,monospace">query.exec_()</span><br><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><span style="font-family:monospace,monospace">query.exec_("SELECT * FROM myTable WHERE id = 2")</span><br><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><span style="font-family:monospace,monospace">query.first()</span><br><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><span style="font-family:monospace,monospace">print(query.value(0), ':', query.value(1))</span><br><font face="monospace, monospace"><span style="background-color:rgb(0,255,255)"># 2 : <br></span></font></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><font face="monospace, monospace"><br><span style="background-color:rgb(0,255,255)"># Convert data to <b>str</b> object: insert Succeeds<br></span></font><span style="font-family:monospace,monospace">sql = "INSERT INTO myTable (id, myValue) VALUES (3, :myValue);"</span><br><span style="font-family:monospace,monospace">query.prepare(sql)</span><br><div><font face="monospace, monospace">query.bindValue(":myValue", <b style="background-color:rgb(255,255,0)">str(data)</b>)</font></div><span style="font-family:monospace,monospace">query.exec_()</span><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><span style="font-family:monospace,monospace">query.exec("SELECT * FROM myTable WHERE id = 3")</span><br><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><span style="font-family:monospace,monospace">query.first()<br></span><span style="font-family:monospace,monospace">print(query.value(0), ':', query.value(1))</span><br style="font-family:monospace,monospace"><span style="font-family:monospace,monospace;background-color:rgb(0,255,255)"># 2 : b'\x01\x02\x03\x04'<br></span></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><font face="monospace, monospace"><div><font face="monospace, monospace"><br></font></div><div><br></div><div>David</div></font><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><font face="monospace, monospace"><br></font></blockquote></div>
</div><br></div>