Skip to main content

Query your data, where it lives

Project description

Opteryx

Query your data, where it lives.

A unified SQL interface to unlock insights across your diverse data sources, from blobs stores to databases - effortless cross-platform data analytics.

Opteryx We're excited to have you join our journey. Let us know how we can help!

PyPI Latest Release Downloads codecov opteryx PyPI Latest Release

InstallExamplesGet Involved

Resource Location
Source Code https://github.com/mabel-dev/opteryx
Documentation https://opteryx.dev/
Download https://pypi.org/project/opteryx/

What is Opteryx?

Opteryx is a Python library enabling SQL queries across diverse data sources like Apache Iceberg, Postgres, Parquet, and MongoDB. Opteryx champions the SQL-on-everything approach, streamlining cross-platform data analytics by federating SQL queries across diverse data sources. The goal is to enhance your data analytics process by offering a unified way to access data from across your organization. Opteryx combines the simplicity of SQLite and DuckDB with federated query capabilities found in Presto and Trino.

Opteryx offers the following features:

  • SQL queries on data files generated by other processes, such as logs
  • A command-line tool for filtering, transforming, and combining files
  • Integration with familiar tools like pandas and Polars
  • Embeddable as a low-cost engine, enabling portability and allowing for hundreds of analysts to leverage ad hoc databases with ease
  • Unified and federated access to data on disk, in the cloud, and in on-premises databases, not only through the same interface but in the same query

How Does it Work?

Opteryx processes queries by first determining the appropriate query language to interact with different downstream data platforms. It translates your query into SQL, CQL, or another suitable query language based on the data source. This enables Opteryx to efficiently retrieve the necessary data from systems such as MySQL or MongoDB to respond to your query.

Opteryx

Why Use Opteryx?

Familiar Interface

Opteryx supports key parts of the Python DBAPI and SQL92 standard standards which many analysts and engineers will already know how to use.

Consistent Syntax

Opteryx creates a common SQL-layer over multiple data platforms, allowing backend systems to be upgraded, migrated or consolidated without changing any Opteryx code.

Where possible, errors and warnings returned by Opteryx help the user to understand how to fix their statement to reduce time-to-success for even novice SQL users.

Consumption-Based Billing Friendly

Opteryx is well-suited for deployments to environments which are pay-as-you-use, like Google Cloud Run. Great for situations where you have low-volume usage, or multiple environments, where the costs of many traditional database deployment can quickly add up.

Python Ecosystem

Opteryx is Open Source Python, it quickly and easily integrates into Python code, including Jupyter Notebooks, so you can start querying your data within a few minutes. Opteryx integrates with many of your favorite Python data tools, you can use Opteryx to run SQL against pandas and Polars DataFrames, and even execute a JOIN on an in-memory DataFrame and a remote SQL dataset.

Time Travel

Designed for data analytics in environments where decisions need to be replayable, Opteryx allows you to query data as at a point in time in the past to replay decision algorithms against facts as they were known in the past. You can even self-join tables historic data, great for finding deltas in datasets over time. (data must be structured to enable temporal queries)

Fast

Benchmarks on M2 Pro Mac running an ad hoc GROUP BY over a 6 million row parquet file via the CLI in ~1/4th of a second from a cold start (no caching and predefined schema). (different systems will have different performance characteristics)

Instant Elasticity

Designed to run in Knative and similar environments like Google Cloud Run, Opteryx can scale down to zero, and scale up to respond to thousands of concurrent queries within seconds.

Bring your own Data

Opteryx

Opteryx supports multiple query engines, dataframe APIs and storage formats. You can mix-and-match sources in a single query. Opteryx can even JOIN datasets stored in different formats and different platforms in the same query, such as Parquet, Apache Iceberg and MySQL.

Opteryx allows you to query your data directly in the systems where they are stored, eliminating the need to duplicate data into a common store for analytics. This saves you the cost and effort of maintaining duplicates.

Opteryx can push parts of your query to the source query engine, allowing queries to run at the speed of the backend, rather than your local computer.

And if there's not a connector in the box for your data platform; feel free to submit a pull request to add one.

Install

Installing from PyPI is recommended.

pip install opteryx

To build Opteryx from source, refer to the contribution guides.

Opteryx installs with a small set of libraries it needs for core functionality, such as Numpy, PyArrow, and orjson. Some features require additional libraries to be installed, you are notified of these libraries as they are required.

Examples

Filter a Dataset on the Command Line

In this example, we are running Opteryx from the command line to filter one of the internal example datasets and display the results on the console.

python -m opteryx "SELECT * FROM \$astronauts WHERE 'Apollo 11' IN UNNEST(missions);"

Opteryx this example is complete and should run as-is

Execute a Simple Query in Python

In this example, we are showing the basic usage of the Python API by executing a simple query that makes no references to any datasets.

# Import the Opteryx SQL query engine library.
import opteryx

# Execute a SQL query to evaluate the expression 4 * 7.
# The result is stored in the 'result' variable.
result = opteryx.query("SELECT 4 * 7;")

# Display the first row(s) of the result to verify the query executed correctly.
result.head()
ID 4 * 7
1 28

this example is complete and should run as-is

Execute SQL on a pandas DataFrame

In this example, we are running a SQL statement on a pandas DataFrame and returning the result as a new pandas DataFrame.

# Required imports
import opteryx
import pandas

# Read data from the exoplanets.csv file hosted on Google Cloud Storage
# The resulting DataFrame is stored in the variable `pandas_df`.
pandas_df = pandas.read_csv("https://storage.googleapis.com/opteryx/exoplanets/exoplanets.csv")

# Register the pandas DataFrame with Opteryx under the alias "exoplanets"
# This makes the DataFrame available for SQL-like queries.
opteryx.register_df("exoplanets", pandas_df)

# Perform an SQL query to group the data by `koi_disposition` and count the number
# of occurrences of each distinct `koi_disposition`.
# The result is stored in `aggregated_df`.
aggregated_df = opteryx.query("SELECT koi_disposition, COUNT(*) FROM exoplanets GROUP BY koi_disposition;").pandas()

# Display the aggregated DataFrame to get a preview of the result.
aggregated_df.head()
  koi_disposition  COUNT(*)
0       CONFIRMED      2293
1  FALSE POSITIVE      5023
2       CANDIDATE      2248 

this example requires network access to download the data file

Query Data on Local Disk

In this example, we are querying and filtering a file directly. This example will not run as written because the file being queried does not exist.

# Import the Opteryx query engine.
import opteryx

# Execute a SQL query to select the first 5 rows from the 'space_missions.parquet' table.
# The result will be stored in the 'result' variable.
result = opteryx.query("SELECT * FROM 'space_missions.parquet' LIMIT 5;")

# Display the result.
# This is useful for quick inspection of the data.
result.head()
ID Company Location Price Launched_at Rocket Rocket_Status Mission Mission_Status
0 RVSN USSR Site 1/5, Baikonur Cosmodrome, null 1957-10-04 19:28:00 Sputnik 8K71PS Retired Sputnik-1 Success
1 RVSN USSR Site 1/5, Baikonur Cosmodrome, null 1957-11-03 02:30:00 Sputnik 8K71PS Retired Sputnik-2 Success
2 US Navy LC-18A, Cape Canaveral AFS, Fl null 1957-12-06 16:44:00 Vanguard Retired Vanguard TV3 Failure
3 AMBA LC-26A, Cape Canaveral AFS, Fl null 1958-02-01 03:48:00 Juno I Retired Explorer 1 Success
4 US Navy LC-18A, Cape Canaveral AFS, Fl null 1958-02-05 07:33:00 Vanguard Retired Vanguard TV3BU Failure

this example requires a data file, space_missions.parquet.

Query Multiple Files with Wildcards

In this example, we are querying multiple files using wildcard patterns. Opteryx supports * (any characters), ? (single character), and [range] patterns in file paths.

# Import the Opteryx query engine.
import opteryx

# Execute a SQL query to select data from all parquet files in a directory.
# The wildcard '*' matches any characters in the filename.
result = opteryx.query("SELECT * FROM 'data/*.parquet' LIMIT 10;")

# Display the result.
result.head()

You can also use more specific patterns:

# Query files matching a range pattern, e.g., file1.parquet through file9.parquet
result = opteryx.query("SELECT COUNT(*) FROM 'data/file[1-9].parquet';")

# Query files with specific naming patterns
result = opteryx.query("SELECT * FROM 'logs/2024-01-*.jsonl';")

Wildcards work with all supported file formats (Parquet, JSONL, CSV, etc.) and prevent path traversal for security.

Query Data in SQLite

In this example, we are querying a SQLite database via Opteryx. This example will not run as written because the file being queried does not exist.

# Import the Opteryx query engine and the SqlConnector from its connectors module.
import opteryx
from opteryx.connectors import SqlConnector

# Register a new data store with the prefix "sql", specifying the SQL Connector to handle it.
# This allows queries with the 'sql' prefix to be routed to the appropriate SQL database.
opteryx.register_store(
   prefix="sql",  # Prefix for distinguishing this particular store
   connector=SqlConnector,  # Specify the connector to handle queries for this store
   remove_prefix=True,  # Remove the prefix from the table name when querying SQLite
   connection="sqlite:///database.db"  # SQLAlchemy connection string for the SQLite database
)

# Execute a SQL query to select specified columns from the 'planets' table in the SQL store,
# limiting the output to 5 rows. The result is stored in the 'result' variable.
result = opteryx.query("SELECT name, mass, diameter, density FROM sql.planets LIMIT 5;")

# Display the result.
# This is useful for quickly verifying that the query executed correctly.
result.head()
ID name mass diameter density
1 Mercury 0.33 4879 5427
2 Venus 4.87 12104 5243
3 Earth 5.97 12756 5514
4 Mars 0.642 6792 3933
5 Jupiter 1898.0 142984 1326

this example requires a data file, database.db.

Query Data on GCS

In this example, we are querying a dataset on GCS in a public bucket called 'opteryx'.

# Import the Opteryx query engine and the GcpCloudStorageConnector from its connectors module.
import opteryx
from opteryx.connectors import GcpCloudStorageConnector

# Register a new data store named 'opteryx', specifying the GcpCloudStorageConnector to handle it.
# This allows queries for this particular store to be routed to the appropriate GCP Cloud Storage bucket.
opteryx.register_store(
    "opteryx",  # Name of the store to register
    GcpCloudStorageConnector  # Connector to handle queries for this store
)

# Execute a SQL query to select all columns from the 'space_missions' table located in the 'opteryx' store,
# and limit the output to 5 rows. The result is stored in the 'result' variable.
result = opteryx.query("SELECT * FROM opteryx.space_missions WITH(NO_PARTITION) LIMIT 5;")

# Display the result.
# This is useful for quickly verifying that the query executed correctly.
result.head()
ID Company Location Price Launched_at Rocket Rocket_Status Mission Mission_Status
0 RVSN USSR Site 1/5, Baikonur Cosmodrome, null 1957-10-04 19:28:00 Sputnik 8K71PS Retired Sputnik-1 Success
1 RVSN USSR Site 1/5, Baikonur Cosmodrome, null 1957-11-03 02:30:00 Sputnik 8K71PS Retired Sputnik-2 Success
2 US Navy LC-18A, Cape Canaveral AFS, Fl null 1957-12-06 16:44:00 Vanguard Retired Vanguard TV3 Failure
3 AMBA LC-26A, Cape Canaveral AFS, Fl null 1958-02-01 03:48:00 Juno I Retired Explorer 1 Success
4 US Navy LC-18A, Cape Canaveral AFS, Fl null 1958-02-05 07:33:00 Vanguard Retired Vanguard TV3BU Failure

this example is complete and should run as-is


You can also try Opteryx right now using our interactive labs on Binder.

Binder

Community

Discord Medium

If you're interested in contributing to Opteryx or understanding how it works:

Resource Location Description
Examples examples/ Code examples and tutorials for various use cases
Developer Guide DEVELOPER_GUIDE.md Guide to Opteryx's architecture and development patterns
Contributing CONTRIBUTING.md How to contribute to the project

Project Structure

  • opteryx/ - Main source code
    • planner/ - Query planning and optimization
    • operators/ - Physical execution operators
    • connectors/ - Data source adapters
    • functions/ - SQL function implementations
    • managers/ - Resource and cache management
  • tests/ - Comprehensive test suite
  • dev/ - Development tools and build scripts
  • examples/ - Usage examples and tutorials
  • tools/ - Development utilities and profiling tools

Get Involved

🌟 Star this repo to show your support and help others discover Opteryx.
💬 Join the discussion — share your ideas, tell us how you’re using Opteryx, or suggest features.
🛠️ Contribute to the code — join us in building Opteryx! It’s easy to get started, and we’re happy to guide you.
📚 Check out the contributor documentation. No matter your skill level, there are ways to contribute.
❤️ We welcome sponsorships of any size. Every contribution helps us make Opteryx even better!

We’re excited to have you join our journey. Let us know how we can help!

Security

We take security seriously. If you find any weaknesses please review our Security Policy let us know through our reporting process.

Static Analysis Vulnerabilities Security Rating

License

License

Opteryx is licensed under Apache 2.0 except where specific modules note otherwise.

Status

Status

Opteryx is in beta. Beta means different things to different people, to us, being beta means:

  • Core functionality has good regression test coverage to help ensure stability
  • Some edge cases may have undetected bugs
  • Performance tuning is incomplete
  • Changes are focused on feature completion, bugs, performance, reducing debt, and security
  • Code structure and APIs are not stable and may change

We’re actively adding features and improving performance.

Related Projects

  • orso DataFrame library
  • draken Cython bindings for Arrow
  • rugo File Reader

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

opteryx-0.26.7.tar.gz (10.2 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

opteryx-0.26.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (40.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

opteryx-0.26.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (38.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

opteryx-0.26.7-cp313-cp313-macosx_11_0_universal2.whl (11.0 MB view details)

Uploaded CPython 3.13macOS 11.0+ universal2 (ARM64, x86-64)

opteryx-0.26.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (40.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

opteryx-0.26.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (38.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

opteryx-0.26.7-cp312-cp312-macosx_11_0_universal2.whl (11.0 MB view details)

Uploaded CPython 3.12macOS 11.0+ universal2 (ARM64, x86-64)

opteryx-0.26.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (41.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

opteryx-0.26.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (39.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

opteryx-0.26.7-cp311-cp311-macosx_11_0_universal2.whl (11.1 MB view details)

Uploaded CPython 3.11macOS 11.0+ universal2 (ARM64, x86-64)

opteryx-0.26.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (40.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

opteryx-0.26.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (38.0 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

opteryx-0.26.7-cp310-cp310-macosx_11_0_universal2.whl (11.1 MB view details)

Uploaded CPython 3.10macOS 11.0+ universal2 (ARM64, x86-64)

opteryx-0.26.7-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (40.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

opteryx-0.26.7-cp39-cp39-macosx_11_0_universal2.whl (11.0 MB view details)

Uploaded CPython 3.9macOS 11.0+ universal2 (ARM64, x86-64)

File details

Details for the file opteryx-0.26.7.tar.gz.

File metadata

  • Download URL: opteryx-0.26.7.tar.gz
  • Upload date:
  • Size: 10.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for opteryx-0.26.7.tar.gz
Algorithm Hash digest
SHA256 b2b86279660593fdc4166c0e9e9c28c7872d2627963ef04d72c78955ec57627c
MD5 eac3ded4b21eb25a3be58a1d9afb65f8
BLAKE2b-256 2c84d66d454ad7862772660d1092536d9f7601d0f874b4319eb9138e0ba82dc4

See more details on using hashes here.

File details

Details for the file opteryx-0.26.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for opteryx-0.26.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 034ad3caf9e97e33e5ba2c04ddafac3a5a85cae09f8215448c8dcfcbaabc226e
MD5 a378aa9c48b7ca94a2bc68e9579e0eca
BLAKE2b-256 bb759d3e4b6cd39d7740271015883a915339c395847c1d88f0aea9ed3ecd05ff

See more details on using hashes here.

File details

Details for the file opteryx-0.26.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for opteryx-0.26.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 0021a4f93c102b6d31daa1d03f6c7d78cea8607f8506a7b1cd6303a9a608c9d2
MD5 3162b87de19f74cc8784172066518358
BLAKE2b-256 4e1a8b4afb066a41c9a2bbf55c42b9122894bd718853e5b62a3c1879d530bd85

See more details on using hashes here.

File details

Details for the file opteryx-0.26.7-cp313-cp313-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for opteryx-0.26.7-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 5cfb823e38d730378352e083dbd8e905e541d89215a1adfeeda9518d8c0888b0
MD5 a6ac8b020ab75d10c2283990fecd3c0d
BLAKE2b-256 8c4a9ce079af81bac156ccef92a06f1f7f5c9627e12b5ca09821d0a8e450a18a

See more details on using hashes here.

File details

Details for the file opteryx-0.26.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for opteryx-0.26.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 40b9eb4333532da52fe3e953b549799148a0899360d32711f4afd8ee4af2ef2a
MD5 486489aa65b7a6828977b3baf7dfdc58
BLAKE2b-256 a17fa5f799e96824958f8770212623b48118272628fb426eaa78952906100cb3

See more details on using hashes here.

File details

Details for the file opteryx-0.26.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for opteryx-0.26.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 237b6fd260026f0fdf322cccf872393ce941eb746fef1dee9e86c4d25c63c782
MD5 71dfb9b621f004b93ed40ef37a901da5
BLAKE2b-256 b7907d29df8bb51f7457878e7dd3d90ff1a8a7d9e47b49db3409b15e462aa295

See more details on using hashes here.

File details

Details for the file opteryx-0.26.7-cp312-cp312-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for opteryx-0.26.7-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 f0fd61f7f016d234a2a3eb1b10cebd8cd8e788a991028ecca5995a049ea347bb
MD5 032592df384c82d2715a7068e36baa0b
BLAKE2b-256 c02505e688878397e7e3e455a6a78c3e89c9a1c6904c3ce0793986af1db9fbf8

See more details on using hashes here.

File details

Details for the file opteryx-0.26.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for opteryx-0.26.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 d1feaf177a3ac7f7634c210397a9c5477d93ffbb03729567c7fe8b3275ac72d8
MD5 863e8b7b0be8bb5757954fee3df8c25b
BLAKE2b-256 daf48faa7086358472e88d0e5c9786baf4207847b42696cf36cdae799e19e427

See more details on using hashes here.

File details

Details for the file opteryx-0.26.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for opteryx-0.26.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 a5e8fcb4aec56965160bc7b79966e90477af2a955e821d05a3544674a7e31830
MD5 0c6d29a944b56358f8baba62f49cddfa
BLAKE2b-256 97d9f3c9e32f16cb5340d633ce03ece9b68c38061593e562e7ff71eafbd60c54

See more details on using hashes here.

File details

Details for the file opteryx-0.26.7-cp311-cp311-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for opteryx-0.26.7-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 c6d23c63d0bc5ffd3be40979703a57439ad289f48ac2fc362f2c1397530fc1ed
MD5 eb570f98ef204309b62a6b57123d67f4
BLAKE2b-256 8e105228b930d7ec763570344ec5cd9b1d91ecfa000bb7871798da293695c2d1

See more details on using hashes here.

File details

Details for the file opteryx-0.26.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for opteryx-0.26.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 df69659ca9abd4263f9175a71abac4fa4fcc0d71f6eb99202a454aad3d7af704
MD5 1bce5dcd333abc570af5f4a61d0107a5
BLAKE2b-256 9f0591deb4c9e0362c527f4e4f6b595eeab122b074f366d7b464e31559e1747b

See more details on using hashes here.

File details

Details for the file opteryx-0.26.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for opteryx-0.26.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 80894f2189fa603b40bb40e501a547ae3c390ace24413c235c0fd700de143dca
MD5 8c5d79dccec598ea4926e23282754cb5
BLAKE2b-256 26916980edef722c98c21bc4235ac13b92a59a977bc8548fc410f8f694b2fdaa

See more details on using hashes here.

File details

Details for the file opteryx-0.26.7-cp310-cp310-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for opteryx-0.26.7-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 2ca82c3fa90bcf9f4f4208f4c79162d09e10b841198b137cc0097e85044a2c35
MD5 e918bcc86eaa5ac23bc02320cabe4c43
BLAKE2b-256 45aca6fee322445049b8b4dae20e363d2316f7c2cbe9c6d933915fd078460b0c

See more details on using hashes here.

File details

Details for the file opteryx-0.26.7-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for opteryx-0.26.7-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 18c97d74ea6dfe8f1ba5cefb5611a7001312a1518b8defb2614a5ae002813055
MD5 32b9f0db7d47c6fa44599ed050cf5a1b
BLAKE2b-256 2fd2dee235a90d77de27ef66a302b0a89131cca3ee70919eb513c9510386e77a

See more details on using hashes here.

File details

Details for the file opteryx-0.26.7-cp39-cp39-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for opteryx-0.26.7-cp39-cp39-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 142dad9682cc9d24c2cefe53403c9914bc97a1b6101562a2911d25d9eae6beaf
MD5 0f23c522dceb533b103746e4ba312f13
BLAKE2b-256 2c19a9cd78ce7b3d8bc7dfc1cfeccfcf24e7a3c5bcbcbb3579be0e2ed0e157c1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page