Repository navigation
Releases
5.4.0 with wheels for Python 3.15
Version 5.4.0 has been released with wheels for Python 3.11 - 3.15
Python support
- Add support for Python 3.15, including wheels, all on PyPI now, by @keitherskine
- Drop support for EOL Python 3.10 by @keitherskine in #1508
- Drop support for EOL Python 3.9 by @mkleehammer in #1499
Behavior changes
- DECIMAL and NUMERIC values are now fetched using SQL_NUMERIC_STRUCT by default, so they are
no longer affected by the locale's decimal separator. SetConnection.fetch_decimal_as_string = True
to restore the previous text-based behavior. By @bkline in #1470
New features
- Support returning rows as dictionaries (
Cursor.rows_as_dicts) by @bkline in #1487 - Add support for SQLTablePrivileges (
Cursor.tablePrivileges()) by @bkline in #1463 - Expose the native ODBC handles (
pyodbc.henv,Connection.hdbc,Cursor.hstmt) by @bkline in #1493 - Make driver_completion configurable (
connect(driver_completion=...)) by @bkline in #1488 - Allow setting of connection string attributes (
Connection.set_attr()) by @bkline in #1465 - Support filtering DSN by scope (
dataSources(scope=...)) by @bkline in #1461 - Make initial ReadVarColumn buffer size configurable (
Connection.readvar_initsize) by @bkline in #1490 - Add flag for buggy SQLGetDiagRecW driver behavior (
Connection.compat_diagrec_byte_length) by @bkline in #1464 - Allow fetch of DB2 BLOB by @bkline in #1462
- Fetch messages when DAE kicks in by @bkline in #1468
Bug fixes
- Fix segfaults when a connect fails by @rad-pat in #1510
- Avoid heap corruption with NULLs in TVPs by @bkline in #1452
- Scan all TVP rows before binding by @bkline in #1481
- Keep SetConnectAttrW buffers alive by @bkline in #1472
- attrs_before: snapshot bytearray into immutable bytes by @mkleehammer in #1500
- Fix fast_executemany rounding Decimal parameters to context precision by @M0d3v1 in #1511
- Size the create_name_map name buffer for UTF-32 metadata by @ziyziy89 in #1512
- Fix reference leak in pyodbc.dataSources() by @apoorvdarshan in #1504
- Fix reference leak and double-DECREF in pyodbc.drivers() by @apoorvdarshan in #1505
- Fix .statistics() issue with Unicode table names by @gordthompson in #1460
- Remove incorrect check when unpickling Row by @bkline in #1466
Build and tests
- Enable assertions for test builds and run SQLite tests in CI by @shramov in #1448
- Prevent tests from failing with FreeTDS by @bkline in #1473
- Remove test dependency coupling for testing UUID retrieval by @bkline in #1475
- Replace custom macros with Py_STRINGIFY() by @bkline in #1485
- Use ODBC Driver 18.6.2.1 for Windows tests now that the TVP crash is fixed by @mkleehammer in #1498
- CI, test, and typing improvements throughout, and SQL Server 2025 in CI, by @keitherskine
Thanks
- @keitherskine for once again keeping the wheel builds and CI current, including Python 3.15.
- @bkline for the large majority of this release's features and fixes.
New Contributors
- @rad-pat made their first contribution in #1510
- @apoorvdarshan made their first contribution in #1504
- @M0d3v1 made their first contribution in #1511
- @ziyziy89 made their first contribution in #1512
Full Changelog: 5.3.0...5.4.0
5.3.0 with wheels for Python 3.14
Version 5.3.0 has been released with wheels for versions 3.9 - 3.14
What's Changed
- Add support for Python 3.14 including wheels, all on PyPI now, by @keitherskine
- Drop support for EOL Python 3.8 by @MatthijsKok in #1445
- Port SQLite tests to pytest by @shramov in #1440
- Use
HOMEBREW_PREFIXto locate Homebrew by @RA80533 in #1212 - Do not perform type check on NULL pointer by @shramov in #1439
New Contributors
- @keitherskine gets all the credit for wheel support and adding 3.14 to the build list.
- @MatthijsKok made their first contribution in #1445
- @shramov made their first contribution in #1440
- @RA80533 made their first contribution in #1212
Full Changelog: 5.2.0...5.3.0
Release 5.2.0 with wheels for Python 3.13
Thanks to @keitherskine there are now wheels for 5.13. There are aiso a few bug fixes that were ready to go.
5.1.0 with Mac ARM (M1 & M2) binaries
Mac M1 & M2 binaries are available going forward.
GitHub added new Mac ARM action runners which is what we use to build each release.
Thanks to @keitherskine who made all this happen. Not only did he write the original release code for all of the other versions, he jumped on the new Mac runner as soon as it was available.
I'd also like to thank the many people working through the Mac binary confusion, testing and providing work arounds until this runner was available: @Carreau @ndmlny-qs @jordantshaw @gabalafou @v-chojas and many others on the Issue.
If you are a Mac user, please let us know how this works for you.
5.0.1 with fix for Azure tokens / binary attrs_before
This is a bug fix for 5.0.0 that restores the ability to pass bytes objects in the attrs_before parameter when connecting. This is often used for Azure with a token. Issue #1289
5.0.0 Release
This is the first 3.x only pyodbc release, supporting Python 3.8-3.12.
The API is backwards compatible, so previous Python 3 products using pyodbc should not need any changes.
Please note that macOS ARM / Apple Silicon binary builds have been problematic due inconsistencies in the way unixODBC libraries can be installed. Please see the issues and discussions.
5.0.0 beta2 - Help test macOS Apple Silicon binary wheels
We're retrying macOS Apple Silicon wheels, for those with M1, M2, etc. chips. If you have one of these, please give this release a try so we know before the final 5.0.0 release in a few days.
This means you would not use Rosetta. Just install normally using pip install pyodbc==5.0.0b2. Don't use --no-binary.
For those wondering, the inability to supply these wheels has not been due to any pyodbc code issues. We use Github Actions to build all the different versions and it still doesn't have complete support for macOS Apple Silicon CI runners. At this time, only Intel is supported. However, we can cross-compile and generate ARM wheels on Intel, but we can't test them. That's why we need your help!
5.0.0 Beta 1
This is a beta release for the upcoming 5.0 that drops Python 2 and adds Python 3.12
Source and wheels for 5.0.0b1 is available on PyPI.
This beta restores fast_executemany, so it should be feature complete. If there are no serious issues reported, it will be released as 5.0.0 this week (before Python 3.12 is officially released).
5.0.0 alpha 2
This is a test release for the upcoming 5.0 that drops Python 2 and supports Python 3.12
Source and wheels for 5.0.0a2 is available on PyPI
Note that fastexecmany is not available in this release, but will be ported to the next.
Please give it a try and join the discussion here.
Bug fix
Version 4.0.38 had a serious bug in Row.repr which could cause crashes (#1196 ). That version has been yanked from PyPI and replaced with this one.