mssql-python 1.14.0 is now available on PyPI. This release moves the standard parameter detection and execution path into native C++, improving throughput for wide parameterized statements and batched workloads. It also corrects connection timeout behavior, prevents Decimal conversion errors from exposing parameter values, and fixes several Arrow, bulk copy, and Windows ARM64 issues.
pip install --upgrade mssql-pythonEvery parameterized execute() call has to identify each Python value, choose the corresponding SQL and C types, bind the values, and call SQLExecute. Previously, mssql-python performed type detection in a Python loop, constructed a ParamInfo object for every parameter, and passed those objects across the pybind11 boundary before the native layer could bind and execute the statement.
In 1.14.0, the standard path performs detection, binding, and execution in one native C++ pipeline and one Python-to-native call. Type checks use the CPython API directly, and the parameter metadata stays in C++.
The improvement grows with the number of parameters in each call. Benchmarks recorded in PR #549 measured type detection at about 35 ns per parameter, down from 2.0 to 2.3 microseconds. For statements with 50 or more parameters, execute() was about 21% to 73% faster across the tested macOS ARM64 and Linux ARM64 environments.
The same PR measured these complete insert workloads on macOS ARM64. These figures include the network round trip and SQL Server writing the rows, not just driver overhead.
| Workload | Before | After | Speedup |
|---|---|---|---|
| Orders: integer, varchar, decimal, datetime2 | 880.6 ms | 561.0 ms | 1.57x |
| Events: UUID, datetime2, varchar, integer | 827.2 ms | 533.5 ms | 1.55x |
| Documents: nvarchar(max) around 10 KB | 1622.0 ms | 1021.3 ms | 1.59x |
| Wide rows: 50 mixed columns | 1598.6 ms | 1048.9 ms | 1.52x |
These are results from the PR benchmark environment, not a throughput guarantee. The gain depends on how much of each call was previously spent inspecting parameters. A benchmark that issued 5,000 single-row calls with four parameters showed no meaningful change because the network round trip dominated the roughly 9 microseconds of parameter detection that was removed.
Calls that use setinputsizes() continue through the existing Python detection path so their explicit type overrides are preserved. No API changes are required, but those calls do not receive this optimization yet.
The timeout argument to connect() is documented as a login timeout, consistent with pyodbc. Before 1.14.0, mssql-python silently stored it as the per-statement query timeout. It did not bound the connection attempt, and a later long-running query could be canceled after that number of seconds.
The two settings are now separate:
from mssql_python import connect # Allow up to five seconds to establish the connection. conn = connect(connection_string, timeout=5) # Allow up to 60 seconds for each statement on this connection. conn.timeout = 60An explicit attrs_before[SQL_ATTR_LOGIN_TIMEOUT] still takes precedence over the timeout argument. Both timeout entry points reject negative values, non-integers, and booleans.
This is a behavior correction with an upgrade implication. If an application relied on connect(timeout=N) to stop long-running queries, set Connection.timeout = N explicitly after upgrading.
When executemany() could not convert a value for a Decimal or NUMERIC parameter, the exception included the entire parameter row. That row could contain names, email addresses, account data, or other sensitive values, and the exception could then be collected by an application log or APM service.
The error now reports only the row index, column index, and Python type:
Failed to convert parameter to Decimal at row 0, column 3 (value type: str)
The fix also prevents a value-bearing exception cause from reintroducing the data through a chained traceback.
See PR #719.
On Windows, platform.machine() reports the host CPU architecture rather than the architecture of the running Python interpreter. An x64 Python installation on a Windows ARM64 machine therefore looked for an ARM64 native extension even though pip had installed the win_amd64 wheel. Import still fell back to another file, but it performed the fallback on every import and printed a warning to stdout.
The loader now derives the architecture from the Python interpreter build, matching the wheel tag. Fallback notices use RuntimeWarning instead of writing to stdout.
See PR #727 and issue #726. Thanks to @Om-singhaI for the contribution.
For most users, upgrading requires no code changes:
pip install --upgrade mssql-pythonCheck these two cases:
Full release notes are available on the mssql-python 1.14.0 release page. File issues and feature requests at github.com/microsoft/mssql-python/issues, or email us at mssql-python@microsoft.com.
Stanley Druckenmiller's obviously AI-written Wall Street Journal op-ed sparked a fierce debate about disclosure, plagiarism, and whether the tool used matters more than the thinking behind it. NLW lays out five rules for AI writing, including why the purity test will fade but the quality test never will, and why perceived laziness undermines the argument itself. Also covered: a practical crib sheet for emails, meeting notes, strategy memos, social copy, marketing, and op-eds.
The AI Daily Brief helps you understand the most important news and discussions in AI.
Subscribe to the podcast version of The AI Daily Brief wherever you listen: https://pod.link/1680633614
Get it ad free at http://patreon.com/aidailybrief
Learn more about the show https://aidailybrief.ai/
In this episode, Andy sits down with Dr. Jeremy Pollack, a social-organizational psychologist and founder of Pollack Peacebuilding Systems, author of Wired for Peace: Using 7 Neuroscience-Based Principles to Resolve Conflicts. Jeremy looks at conflict through the lens of the brain and nervous system, which helps explain why disagreements escalate so quickly and why the fixes we reach for often make things worse.
Andy and Jeremy talk about why de-escalation has to come before problem-solving, since solutions and stress do not mix. Jeremy walks us through his Sapien Model of six basic psychological needs, giving us a far more useful lens than labeling a stakeholder difficult, defensive, or resistant. You will hear how memory and prediction shape the way we read the person in front of us, what a team learns when its leader consistently avoids conflict, and why changing our experience of conflict requires new experiences, not just new beliefs. Jeremy also shares how this shows up at home, in marriage and parenting.
If you're looking for a practical, evidence-based way to handle the conflicts that come with leading, this episode is for you!
You can learn more about Jeremy and his work at CoachJeremyPollack.com.
For more learning on this topic, check out:
You can chat directly with PMeLa, the podcast's AI persona, to get episode recommendations and answers to your project management and leadership questions. Visit PeopleAndProjectsPodcast.com/PMeLa to chat with her.
I know you want to be a more confident leader–that's why you listen to this podcast. LEAD52 is a global community of people like you who are committed to transforming their ability to lead and deliver. It's 52 weeks of leadership learning, delivered right to your inbox, taking less than 5 minutes a week. And it's all for free. Learn more and sign up at GetLEAD52.com. Thanks!
Thank you for joining me for this episode of The People and Projects Podcast!
Talent Triangle: Power Skills
Topics: Leadership, Project Management, Conflict Resolution, Neuroscience, De-escalation, Psychological Safety, Emotional Regulation, Memory, Stakeholder Management, Team Culture, Accountability, Parenting
The following music was used for this episode:
Music: On Point by Steven O'Brien
License (CC BY 4.0): https://filmmusic.io/standard-license
Music: Energetic Drive Indie Rock by WinnieTheMoog
License (CC BY 4.0): https://filmmusic.io/standard-license