pymssql dialect doesn't encode binary params correctly in Python 3
Issue #2683
resolved
The module.Binary
function is set to str
but when given a bytes
object in Python 3, this will emit a string with a b
in it and double backslashes.
Take the following program:
from sqlalchemy import create_engine
from sqlalchemy import MetaData
from sqlalchemy import Table, Column
from sqlalchemy import Integer, String, PickleType
from sqlalchemy.dialects import mssql
engine = create_engine(
'mssql+pymssql://...?charset=UTF-8',
echo=False)
user_table = Table(
'user', MetaData(),
Column('id', Integer, primary_key=True),
Column('data', PickleType()))
user_table.drop(engine, checkfirst=True)
user_table.create(engine)
insert_stmt = user_table.insert().values(id=1, data=[Jones']('Ed))
engine.echo = True
engine.execute(insert_stmt)
The output of running this in Python 3 is:
marca@marca-mac:~/dev/hg-repos/pymssql$ .tox/py33/bin/python my_sqlalchemy_bug.py
2013-03-18 13:11:30,824 INFO sqlalchemy.engine.base.Engine SET IDENTITY_INSERT [user](user) ON
2013-03-18 13:11:30,824 INFO sqlalchemy.engine.base.Engine ()
2013-03-18 13:11:30,825 INFO sqlalchemy.engine.base.Engine INSERT INTO [user](user) (id, data) VALUES (%(id)s, %(data)s)
2013-03-18 13:11:30,825 INFO sqlalchemy.engine.base.Engine {'id': 1, 'data': "b'\\x80\\x03]q\\x00X\\x08\\x00\\x00\\x00Ed Jonesq\\x01a.'"}
2013-03-18 13:11:30,827 INFO sqlalchemy.engine.base.Engine ROLLBACK
Note that data == "b'\\x80\\x03]q\\x00X\\x08\\x00\\x00\\x00Ed Jonesq\\x01a.'"
. I think that it should be b'\x80\x03]q\x00X\x08\x00\x00\x00Ed Jonesq\x01a.'
.
I plan to submit a pull request to fix this momentarily...
Comments (4)
-
reporter -
reporter And here's the output of the test program with the change in the pull request:
marca@marca-mac:~/dev/hg-repos/pymssql$ .tox/py33/bin/python my_sqlalchemy_bug.py 2013-03-18 14:01:54,531 INFO sqlalchemy.engine.base.Engine SET IDENTITY_INSERT [user](user) ON 2013-03-18 14:01:54,531 INFO sqlalchemy.engine.base.Engine () 2013-03-18 14:01:54,532 INFO sqlalchemy.engine.base.Engine INSERT INTO [user](user) (id, data) VALUES (%(id)s, %(data)s) 2013-03-18 14:01:54,532 INFO sqlalchemy.engine.base.Engine {'id': 1, 'data': b'\x80\x03]q\x00X\x08\x00\x00\x00Ed Jonesq\x01a.'} 2013-03-18 14:01:54,534 INFO sqlalchemy.engine.base.Engine SET IDENTITY_INSERT [user](user) OFF 2013-03-18 14:01:54,534 INFO sqlalchemy.engine.base.Engine () 2013-03-18 14:01:54,535 INFO sqlalchemy.engine.base.Engine COMMIT
-
repo owner -
repo owner - removed milestone
Removing milestone: 0.8.xx (automated comment)
- Log in to comment
And here's the pull request: https://bitbucket.org/sqlalchemy/sqlalchemy/pull-request/46/dialects-mssql-pymssqlpy-modify/diff