NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #935 most downloaded on PyPI
Python DB API 2.0 (PEP 249) client for Amazon Athena
Last release 5 days ago
29 Sep 2026
Release timing varies
gaps range from 8 days to 2 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
9 years old
184 releases · first in 2017
Support for statement cache in SQLAlchemy #323
Fix deprecation warning in re.compile #316 Thanks @sadikkuzu #315
One column per quarter.
Add cluster and bucket_count to dialect options in SQLAlchemy #310 Support for bucketing in SQLAlchemy table creation.
cluster and bucket_count to dialect options in SQLAlchemy #310
Support for bucketing in SQLAlchemy table creation.Add row_format, file_format, serdeproperties and tblproperties to dialect options in SQLAlchemy #306
row_format, file_format, serdeproperties and tblproperties to dialect options in SQLAlchemy #306
s3_dir option in the connection string has been removed and is now specified in the location of the dialect option.AthenaRowFormat model class.AthenaFileFormat and AthenaRowFormatSerde model classesFix escape handling for insert statements containing single quotes #304 Thanks @bertop89 #238
Remove next method for compatibility with Python2 #300
Add missing partition key columns to get_columns in SQLAlchemy #293 Thanks @nananathanh #292
Fix CAST from STRING to VARCHAR for string types with unspecified length in SQLAlchemy #291 Thanks @luca-ferreri @andreaschiappacasse #289
Add support for table and column comments in SQLAlchemy #264 Thanks @cansjt #263
Fix to not include views when getting table names in SQLAlchemy.
Add base dialect definition awsathena, independent of driver notation.
awsathena, independent of driver notation.Support partitions with special chars table names. Thanks @fernbach.
Allow the boto3 session object to pass as an argument to the connection method. Thanks @benkehoe.
Nothing published for this version
Change schema name (database name) to optional.
Support duration_seconds, poll_interval and kill_on_interrupt options in SQLAlchemy connection string. Thanks @acountrec.
Change the default value of na_values in PandasCursor from None to empty character. If you want to change the behavior to that of the previous version
na_values in PandasCursor from None to empty character.
If you want to change the behavior to that of the previous version, explicitly set na_values to None in the argument of the execute method.import pyathena
from pyathena.pandas.cursor import PandasCursor
cursor = pyathena.connect(s3_staging_dir="s3://YOUR_S3_BUCKET/path/to/",
region_name="us-west-2",
cursor_class=PandasCursor).cursor()
df = cursor.execute("SELECT * FROM many_rows",
na_values=None).as_pandas()
Thanks @EdwardJRoss. (#204)Support Multi-factor authentication. https://github.com/laughingman7743/PyAthena#multi-factor-authentication https://github.com/laughingman7743/PyAthe
Fix poll_interval type from int to float. Thanks @naikordian.
Fix extra package names to lowercase. Thanks @Akeboshiwind.
Drop support for Python2.7 and Python3.5.
pyathena.pandas.execution_time_in_millis field from the cursor and result set object. (Same as the engine_execution_time_in_millis field)Support duration_seconds, poll_interval and kill_on_interrupt options in SQLAlchemy connection string. Thanks @acountrec.
Change the default value of na_values in PandasCursor from None to empty character. If you want to change the behavior to that of the previous version
na_values in PandasCursor from None to empty character.
If you want to change the behavior to that of the previous version, explicitly set na_values to None in the argument of the execute method.import pyathena
from pyathena.pandas_cursor import PandasCursor
cursor = pyathena.connect(s3_staging_dir="s3://YOUR_S3_BUCKET/path/to/",
region_name="us-west-2",
cursor_class=PandasCursor).cursor()
df = cursor.execute("SELECT * FROM many_rows",
na_values=None).as_pandas()
Thanks @EdwardJRoss. (#204)Support verify option in SQLAlchemy connection string. Thanks @tamersalama.
Fix for empty string decimal value in PandasCursor. Thanks @hoffrocket. (laughingman7743/PyAthena/pull/157)
Add keep_default_na, na_values and quoting arguments to the PandasCursor execute method.
Support for canceling query execution on KeyboardInterrupt.
Fix types mismatch in the pandas.DataFrame.to_sql method. Thanks @RiccardoDiGuida, @thibault-ketterer. (laughingman7743/PyAthena/issues/145, laughingm
Fix an overflow error in PandaCursor. Thanks @juviasuisei @KneeShard. (laughingman7743/PyAthena/issues/141)
Add the following query execution statistics. Thanks @navi86. (laughingman7743/PyAthena/pull/140)
Fix invalid requests when only workgroups are specified. Thanks @kanga333. (laughingman7743/PyAthena/issues/136)
Support China region endpoints. Thanks @liangruibupt. (laughingman7743/PyAthena/issues/134)
Fix work_group condition when referencing query cache. Thanks @Jason-Crowe. (laughingman7743/PyAthena/issues/130)
Fix parameter format of Decimal type. Thanks @EdwardJRoss. (laughingman7743/PyAthena/issues/121)
Fix PandasCursor to not ignore rows containing only null values. Thanks @EdwardJRoss. (laughingman7743/PyAthena/issues/117)
Support pandas.to_sql. See README for details. Thanks @kismsu, @DyfanJones. (laughingman7743/PyAthena/issues/101, laughingman7743/PyAthena/pull/110)
Redesign Formatter and Converter classes. You can now customize dtypes and converters for the Dataframe object. See README for details.
Implement query result caching. See README for details.
Implement query result caching. See README for details.
You can attempt to re-use the results from a previously run query to help save time and money in the cases where your underlying data isn't changing. Set the cache_size parameter of cursor.execute() to a number larger than 0 to enable cacheing. (Cacheing is turned off by default.)
Thanks @kbrose. (laughingman7743/PyAthena/pull/96)
Check that column_default is not nan. Thanks @capitancambio. (laughingman7743/PyAthena/pull/94)
Exclude tests from dist package. Thanks @gaqzi. (laughingman7743/PyAthena/pull/86)
Implement AsyncPandasCursor. Thanks @JivanRoquet. (/issues/81)
Fix Pandas to lazy import. Thanks @sroussi. (laughingman7743/PyAthena/issues/82)
Support integer NA values in PnadasCursor. Restrict the allowable version of Pandas(>=0.24.0). Thanks @austinlostinboston, @mckeown12 and @xinluo-gogo
Nothing published for this version
Allow s3_staging_dir to be overridden in query execution. Thanks @aidin36. (laughingman7743/PyAthena/issues/53)
Support botocore config argument. Thanks @m-for-madness. (laughingman7743/PyAthena/issues/64)
Fix AttributeError: 'Engine' object has no attribute 'connection'. Thanks @mrshu. (laughingman7743/PyAthena/issues/63)
Allow empty results from PandasCursor. Thanks @jkleint. (laughingman7743/PyAthena/pull/58)
Fix to make it None when SQLAlchemy's URI username and password are empty strings. If you do not specify aws_access_key_id and aws_secret_access_key i
aws_access_key_id and aws_secret_access_key in SQLAlchemy using the instance profile or boto3 configuration file, the connection string is as follows:awsathena+rest://:@athena.{region_name}.amazonaws.com:443/{schema_name}?s3_staging_dir={s3_staging_dir}&...
Thanks @leahein. (laughingman7743/PyAthena/issues/54)Fix condition of has_table method in SQLAlchemy.
Nothing published for this version
Implement PandasCursor. Thanks @jkleint. (laughingman7743/PyAthena/issues/46)
Fix the context manager to return a connection object instead of a cursor object. Thanks @spicy-jmr. (laughingman7743/PyAthena/issues/41)
Support RoleArn in SQLAlchemy URI. Thanks @icy. (laughingman7743/PyAthenaJDBC#62)
Fix regular expression of DataCatalogException
Fix type code contract. PEP 249 - Type Objects and Constructors https://www.python.org/dev/peps/pep-0249/#type-objects-and-constructors Thanks @memepl
Add test of get_columns method retry condition.
Fix retry condition of get_columns method.
Add retry processing to get_columns method of SQLAlchemy.
Change the behavior of the default formatter. Escaping is required only for the query with parameter containing % character.
% character.Your coding agent can read these notes before it upgrades. Set up the MCP server →