Skip to main content

A high-performance Python library for Microsoft SQL Server using Rust and Tiberius

Project description

Fastmssql ⚡

A Python library for Microsoft SQL Server built with Rust using the Tiberius driver, PyO3, and bb8 connection pooling.

Language Async Performance

Features

  • High Performance: Exceptional throughput with 17,800+ RPS capability
  • Rust-Powered Backend: Built with Rust for memory safety and reliability
  • No ODBC Required: Direct native SQL Server connection without ODBC drivers
  • Connection Pooling: Intelligent bb8-based connection pooling (default: 75 max, 25 min idle)
  • Async-Only Design: Built on Tokio with clean async/await API
  • Context Managers: Automatic resource management with async with
  • Type Safety: Strong typing with automatic Python type conversion
  • Thread Safety: Support for concurrent operations
  • Cross-Platform: Works on Windows, macOS, and Linux
  • Simple API: Clean, intuitive async-only interface with separate query() and execute() methods

Key API Methods

FastMSSQL provides two distinct methods for database operations:

  • query() - For SELECT statements that return rows
  • execute() - For INSERT/UPDATE/DELETE statements that return affected row count
# Use query() for SELECT statements
result = await conn.query("SELECT * FROM users WHERE age > @P1", [25])
rows = result.rows()

# Use execute() for data modification
affected = await conn.execute("INSERT INTO users (name) VALUES (@P1)", ["John"])

Performance Highlights

Fastmssql delivers exceptional database performance through Rust-powered architecture:

  • Outstanding Throughput: Up to 17,800+ RPS with multiple connection pattern
  • High Performance: 5,000+ RPS with single connection (default usage)
  • Low Latency: ~2ms average query latency under high load
  • Scalable Architecture: Linear scaling with multiple connection objects
  • Production Ready: Stable API with comprehensive error handling
  • Connection Pooling: Efficient resource management with configurable pools
  • Type Conversion: Automatic conversion between SQL Server and Python types
  • SSL/TLS Support: Secure connections with flexible encryption options

Performance Benchmarks

Pattern RPS Configuration Use Case
Single Connection (Default) 5,000+ Default pool (75/25) Standard applications
Multiple Connections 17,800+ 50 workers, high_throughput() High-concurrency scenarios
Conservative Load 3,500+ Shared connection Traditional pooling

Benchmark Environment:

  • Database: SQL Server (local instance)
  • Query: SELECT 1 (minimal overhead)
  • Test Duration: 15-30 seconds per test
  • Hardware: Modern development machine

Key Performance Insights:

  1. Multiple Connection Objects: Creating separate Connection() objects eliminates serialization bottlenecks
  2. Pool Configuration: Use PoolConfig.high_throughput() for demanding workloads
  3. Optimal Worker Count: 30-50 concurrent workers provides best throughput
  4. Tokio Optimization: Aggressive threading configuration maximizes async performance

Installation

From PyPI (Recommended)

Install fastmssql using pip:

pip install fastmssql

Prerequisites

  • Python 3.8 to 3.13
  • Microsoft SQL Server (any recent version)

From Source (Development)

Ensure you have Docker, Rust, and Python installed. If you want to build from source or contribute to development:

  1. Clone the repository:
git clone <your-repo-url>
cd mssql-python-rust
  1. Run the setup script
./setup.sh

Quick Start

Basic Async Usage (Recommended)

import asyncio
from fastmssql import Connection

async def main():
    # Connect to SQL Server using async context manager
    connection_string = "Server=localhost;Database=master;User Id=myuser;Password=mypass"
    
    # Automatic connection pool management
    async with Connection(connection_string) as conn:
        # Use query() for SELECT statements that return rows
        result = await conn.query("SELECT @@VERSION as version")
        rows = result.rows()
        for row in rows:
            print(row['version'])
        
        # Pool statistics
        stats = conn.pool_stats()
        print(f"Pool: {stats['active_connections']}/{stats['connections']} connections active")

asyncio.run(main())

Connection Methods

The library supports two ways to connect to SQL Server:

1. Connection String (Traditional)

import asyncio
from fastmssql import Connection

async def main():
    # Traditional connection string approach
    connection_string = "Server=localhost;Database=master;User Id=myuser;Password=mypass"
    
    async with Connection(connection_string=connection_string) as conn:
        # Use query() for SELECT statements that return rows
        result = await conn.query("SELECT @@VERSION as version")
        rows = result.rows()
        for row in rows:
            print(row['version'])

asyncio.run(main())

2. Individual Parameters

import asyncio
from fastmssql import Connection

async def main():
    # Using individual connection parameters
    
    # SQL Server Authentication  
    async with Connection(
        server="localhost",
        database="master",
        username="myuser",
        password="mypassword"
    ) as conn:
        # Use query() for SELECT statements that return rows
        result = await conn.query("SELECT SUSER_NAME() as login")
        rows = result.rows()
        for row in rows:
            print(f"Logged in as: {row['login']}")

asyncio.run(main())

Performance Patterns

For maximum performance in high-concurrency scenarios, create multiple Connection objects:

import asyncio
from fastmssql import Connection, PoolConfig

async def high_performance_pattern():
    """Optimal pattern for maximum throughput."""
    connection_string = "Server=localhost;Database=master;User Id=myuser;Password=mypass"
    config = PoolConfig.high_throughput()  # Optimized settings
    
    async def worker():
        # Each worker gets its own Connection object for maximum throughput
        async with Connection(connection_string, pool_config=config) as conn:
            for _ in range(1000):
                # Use query() for SELECT statements that return rows
                result = await conn.query("SELECT data FROM my_table WHERE id = @P1", [123])
                rows = result.rows()
                # Process results...
    
    # Launch multiple workers - each with their own connection
    workers = [asyncio.create_task(worker()) for _ in range(50)]
    await asyncio.gather(*workers)
    
    # This pattern can achieve 17,800+ RPS

asyncio.run(high_performance_pattern())

Key Performance Insight: While a single Connection object provides excellent performance (5,000+ RPS), creating multiple Connection objects eliminates serialization bottlenecks and can achieve 17,800+ RPS for maximum throughput scenarios.

Connection Pool Configuration

Configure the connection pool for your specific needs:

import asyncio
from fastmssql import Connection, PoolConfig

async def main():
    # Custom pool configuration
    pool_config = PoolConfig(
        max_size=20,              # Maximum connections in pool
        min_idle=5,               # Minimum idle connections
        max_lifetime_secs=3600,   # Connection max lifetime (1 hour)
        idle_timeout_secs=600,    # Idle connection timeout (10 min)
        connection_timeout_secs=30 # Max wait time for connection
    )

    async with Connection(connection_string, pool_config) as conn:
        # Use query() for SELECT statements that return rows
        result = await conn.query("SELECT * FROM users")
        rows = result.rows()
        for row in rows:
            print(f"User: {row['name']}")
        
    # Predefined configurations for different scenarios
    high_throughput_config = PoolConfig.high_throughput()     # 100 connections, optimized for high RPS
    maximum_performance = PoolConfig.maximum_performance()     # 150 connections, optimized for peak load
    low_resource_config = PoolConfig.low_resource()           # 3 connections, minimal resources  
    dev_config = PoolConfig.development()                     # 5 connections, shorter timeouts

    # Default configuration is optimized for high performance
    # Default: max_size=75, min_idle=25 - ready for production workloads
    
    # For maximum throughput, use multiple Connection objects:
    async def high_perf_worker():
        async with Connection(connection_string, maximum_performance) as conn:
            # Use query() for SELECT statements that return rows
            result = await conn.query("SELECT * FROM fast_table")
            return result.rows()
    
    # Each worker gets its own connection for optimal performance
    tasks = [asyncio.create_task(high_perf_worker()) for _ in range(50)]
    results = await asyncio.gather(*tasks)

asyncio.run(main())

Connection Strings

The library supports standard SQL Server connection string formats:

# SQL Server Authentication
conn_str = "Server=localhost;Database=MyDB;User Id=sa;Password=MyPassword"

# With specific port
conn_str = "Server=localhost,1433;Database=MyDB;User Id=myuser;Password=mypass"

# Azure SQL Database
conn_str = "Server=tcp:myserver.database.windows.net,1433;Database=MyDB;User Id=myuser;Password=mypass;Encrypt=true"

Working with Data

import asyncio
from fastmssql import Connection

async def main():
    async with Connection(connection_string) as conn:
        # === SELECT QUERIES - Use query() method (returns rows) ===
        result = await conn.query("SELECT id, name, email FROM users WHERE active = 1")
        rows = result.rows()
        
        # Iterate through results
        for row in rows:
            print(f"User {row['id']}: {row['name']} ({row['email']})")
        
        # === DATA MODIFICATION - Use execute() method (returns affected row count) ===
        # INSERT operation
        rows_affected = await conn.execute(
            "INSERT INTO users (name, email, active) VALUES (@P1, @P2, @P3)",
            ["John Doe", "john@example.com", 1]
        )
        print(f"Inserted {rows_affected} row(s)")
        
        # UPDATE operation
        rows_affected = await conn.execute(
            "UPDATE users SET last_login = GETDATE() WHERE id = @P1",
            [123]
        )
        print(f"Updated {rows_affected} row(s)")
        
        # DELETE operation
        rows_affected = await conn.execute(
            "DELETE FROM users WHERE active = 0 AND last_login < DATEADD(year, -1, GETDATE())"
        )
        print(f"Deleted {rows_affected} inactive users")
        
        # === WORKING WITH DIFFERENT DATA TYPES ===
        result = await conn.query("""
            SELECT 
                42 as int_value,
                3.14159 as float_value,
                'Hello World' as string_value,
                GETDATE() as datetime_value,
                CAST(1 as BIT) as bool_value,
                NULL as null_value
        """)
        
        rows = result.rows()
        if rows:
            row = rows[0]
            for column_name, value in row.items():
                print(f"{column_name}: {value} (type: {type(value).__name__})")

asyncio.run(main())

Usage

Asynchronous Usage with Connection Pooling

Full async/await support with automatic connection pool management:

import asyncio
from fastmssql import Connection

async def main():
    connection_string = "Server=localhost;Database=test;Integrated Security=true"
    
    # Async context manager with automatic pool management
    async with Connection(connection_string) as conn:
        # Use query() for SELECT statements that return rows
        result = await conn.query("SELECT name FROM sys.databases")
        rows = result.rows()
        for row in rows:
            print(row['name'])
            
        # Pool statistics
        stats = conn.pool_stats()
        print(f"Pool: {stats['active_connections']}/{stats['connections']} connections active")
    
    # High-performance concurrent operations
    async def fetch_user_data(user_id):
        async with Connection(connection_string) as conn:
            # Use query() for SELECT statements that return rows
            result = await conn.query(f"SELECT * FROM users WHERE id = {user_id}")
            return result.rows()
    
    # Execute multiple queries concurrently using the connection pool
    user_ids = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    tasks = [fetch_user_data(uid) for uid in user_ids]
    results = await asyncio.gather(*tasks)  # bb8 pool handles concurrent connections efficiently
    
    for user_data in results:
        if user_data:
            print(f"User: {user_data[0]['name']}")

asyncio.run(main())

Development

Building from Source

# Install development dependencies
pip install maturin pytest pytest-asyncio black ruff

# Build in development mode
maturin develop

# Run tests
python -m pytest tests/

# Format code
black python/
ruff check python/

Project Structure

mssql-python-rust/
├── src/                    # Rust source code
│   ├── lib.rs             # Main library entry point
│   ├── connection.rs      # Connection handling
│   ├── query.rs           # Query execution
│   └── types.rs           # Type definitions
├── python/                # Python source code
│   ├── __init__.py        # Main Python module
│   ├── mssql.py          # High-level API
│   └── types.py          # Python type definitions
├── examples/              # Usage examples
├── tests/                 # Test files
├── Cargo.toml            # Rust dependencies
├── pyproject.toml        # Python project configuration
└── README.md             # This file

Testing

Run the examples to test your installation:

# Basic functionality
python examples/basic_usage.py

# Advanced features
python examples/advanced_usage.py

API Reference

Query vs Execute Methods

FastMSSQL provides two distinct methods for database operations:

  • query() - For SELECT statements that return rows

    • Returns a QueryResult object with a rows() method
    • Use for retrieving data from the database
  • execute() - For INSERT, UPDATE, DELETE statements

    • Returns the number of affected rows as an integer
    • Use for modifying data in the database

SQL Server Parameter Syntax: Use positional parameters @P1, @P2, @P3, etc.

# SELECT queries - use query()
result = await conn.query("SELECT * FROM users WHERE age > @P1 AND city = @P2", [25, "New York"])
rows = result.rows()

# INSERT/UPDATE/DELETE - use execute()  
affected = await conn.execute("INSERT INTO users (name, email) VALUES (@P1, @P2)", ["John", "john@example.com"])

Core Classes

Connection

Main connection class with bb8 connection pool management.

Constructor:

Connection(connection_string: str, pool_config: Optional[PoolConfig] = None)

Context Manager Support:

# Asynchronous (recommended)
async with Connection(conn_str) as conn:
    # Use query() for SELECT statements
    result = await conn.query("SELECT * FROM table")
    rows = result.rows()
    
    # Use execute() for INSERT/UPDATE/DELETE statements  
    affected = await conn.execute("INSERT INTO table (col) VALUES (@P1)", ["value"])

**Methods:**
- `query(sql: str, params: Optional[List] = None) -> QueryResult` - Execute SELECT queries that return rows
- `execute(sql: str, params: Optional[List] = None) -> int` - Execute INSERT/UPDATE/DELETE statements, returns affected row count
- `pool_stats() -> dict` - Get connection pool statistics
- `disconnect()` - Close the connection pool
- `is_connected() -> bool` - Check if pool is active

**Method Details:**

`query()` - For SELECT statements that return data:
```python
# Returns a QueryResult object with rows() method
result = await conn.query("SELECT * FROM users WHERE age > @P1", [21])
rows = result.rows()
for row in rows:
    print(row['name'])

execute() - For INSERT/UPDATE/DELETE statements:

# Returns the number of affected rows
affected = await conn.execute("INSERT INTO users (name) VALUES (@P1)", ["John"])
print(f"Inserted {affected} row(s)")

affected = await conn.execute("UPDATE users SET age = @P1 WHERE name = @P2", [25, "John"])
print(f"Updated {affected} row(s)")

Pool Statistics:

stats = conn.pool_stats()
# Returns: {
#     'connections': 10,        # Total connections in pool
#     'active_connections': 3,  # Currently active connections  
#     'idle_connections': 7     # Available idle connections
# }

PoolConfig

Configuration class for bb8 connection pool settings.

Constructor:

PoolConfig(
    max_size: int = 10,                    # Maximum connections in pool
    min_idle: int = 0,                     # Minimum idle connections
    max_lifetime_secs: Optional[int] = None,  # Connection max lifetime
    idle_timeout_secs: Optional[int] = None,  # Idle connection timeout
    connection_timeout_secs: int = 30         # Max wait time for connection
)

Predefined Configurations:

# High throughput applications (web servers, APIs)
config = PoolConfig.high_throughput()    # 20 connections, optimized settings

# Low resource environments (embedded, containers)  
config = PoolConfig.low_resource()       # 3 connections, minimal overhead

# Development environments
config = PoolConfig.development()        # 5 connections, shorter timeouts

Row

Represents a database row with column access.

Methods:

  • get(column: str) -> Value - Get value by column name
  • get_by_index(index: int) -> Value - Get value by column index
  • columns() -> List[str] - Get column names
  • values() -> List[Value] - Get all values
  • to_dict() -> dict - Convert to dictionary

Module Functions

Connection Management

# Create connection with connection pooling
Connection(connection_string: str, pool_config: Optional[PoolConfig] = None) -> Connection

# Usage with async context manager (recommended)
async with Connection(connection_string) as conn:
    # Use query() for SELECT statements that return rows
    result = await conn.query("SELECT * FROM users")
    rows = result.rows()
    
    # Use execute() for INSERT/UPDATE/DELETE statements that return affected count
    affected = await conn.execute("INSERT INTO users (name) VALUES (@P1)", ["John"])

Utility Functions

version() -> str  # Get library version

Connection Pool Architecture

The library uses the bb8 connection pool for efficient resource management:

  1. Pool Initialization: Creates a pool of reusable connections on first use
  2. Connection Reuse: Automatically reuses idle connections for new requests
  3. Load Balancing: Distributes connections across concurrent operations
  4. Automatic Cleanup: Closes idle connections based on timeout settings
  5. Thread Safety: Safe for use across multiple threads and async tasks

Error Handling

try:
    async with mssql.connect_async(connection_string) as conn:
        result = await conn.query("SELECT * FROM invalid_table")
        rows = result.rows()
except Exception as e:
    print(f"Database error: {e}")
    # Connection automatically returned to pool even on error

Migration to Async-Only Architecture

This library has been upgraded to use async-only operations with the bb8 connection pool for improved performance and reliability.

Async-Only API:

# Async-only with automatic connection pooling
async with mssql.connect_async(conn_str) as conn:
    result = await conn.query("SELECT * FROM table")
    rows = result.rows()
    
    # Pool statistics
    stats = conn.pool_stats()
    print(f"Pool utilization: {stats['active_connections']}/{stats['connections']}")

Advanced Usage Patterns

Custom Pool Configuration for Different Scenarios

from fastmssql import Connection, PoolConfig

# High-load web application
web_config = PoolConfig(
    max_size=50,               # Handle many concurrent requests
    min_idle=10,               # Keep connections ready
    max_lifetime_secs=1800,    # 30 min connection lifetime
    idle_timeout_secs=300,     # 5 min idle timeout
    connection_timeout_secs=10 # Fast timeout for web responses
)

# Batch processing application  
batch_config = PoolConfig(
    max_size=5,                # Fewer connections
    min_idle=2,                # Always keep some ready
    max_lifetime_secs=7200,    # 2 hour lifetime for long operations
    idle_timeout_secs=1800,    # 30 min idle timeout
    connection_timeout_secs=60 # Longer timeout for batch work
)

# Microservice with limited resources
micro_config = PoolConfig(
    max_size=3,                # Minimal connections
    min_idle=1,                # One always ready
    max_lifetime_secs=3600,    # 1 hour lifetime
    idle_timeout_secs=600,     # 10 min idle timeout
    connection_timeout_secs=15 # Quick timeout
)

Monitoring Pool Health

async def monitor_database_pool():
    """Monitor connection pool health and performance"""
    
    async with mssql.connect_async(connection_string) as conn:
        while True:
            stats = conn.pool_stats()
            utilization = stats['active_connections'] / stats['connections'] * 100
            
            print(f"Pool Utilization: {utilization:.1f}%")
            print(f"Active: {stats['active_connections']}, Idle: {stats['idle_connections']}")
            
            # Alert if pool utilization is too high
            if utilization > 90:
                print("WARNING: High pool utilization detected!")
                
            await asyncio.sleep(30)  # Check every 30 seconds

Optimizing for Different Database Workloads

# OLTP (Online Transaction Processing) - Many small, fast queries
oltp_config = PoolConfig.high_throughput()
async def oltp_operations():
    async with mssql.connect_async(conn_str, oltp_config) as conn:
        # Fast, concurrent transactions
        tasks = [
            conn.query("SELECT * FROM users WHERE id = @P1", [user_id])
            for user_id in range(1, 101)
        ]
        results = await asyncio.gather(*tasks)

# OLAP (Online Analytical Processing) - Fewer, longer-running queries  
olap_config = PoolConfig.low_resource()
async def olap_operations():
    async with mssql.connect_async(conn_str, olap_config) as conn:
        # Long-running analytical queries
        result = await conn.query("""
            SELECT 
                DATE_TRUNC('quarter', order_date) as quarter,
                SUM(total_amount) as total_revenue,
                COUNT(*) as order_count
            FROM orders 
            WHERE order_date >= '2024-01-01'
            GROUP BY DATE_TRUNC('quarter', order_date)
            ORDER BY quarter
        """)
        return result.rows()

API Reference

Common Issues

  1. Import Error: Make sure you've built the extension with maturin develop
  2. Connection Fails: Check your connection string and SQL Server configuration. Note that Windows authentication is not supported - use SQL Server authentication with username and password.
  3. Build Errors: Ensure you have the Rust toolchain installed
  4. Build Issues: Make sure you have the Microsoft Visual C++ Build Tools on Windows

Contributing

Contributions are welcome! Please open an issue or submit a pull request for any enhancements or bug fixes.

License

This project is licensed under the PolyForm Noncommercial License 1.0.0. See the LICENSE file for details.

Third-Party Attributions

This project includes and depends on third-party libraries licensed under the Apache License 2.0 and MIT License, as well as other open source licenses.

Note: Additional third-party libraries and their license information are listed in licenses/NOTICE.txt.

See the licenses/NOTICE.txt file for full attribution and copyright information. The full text of the Apache License 2.0 is provided in the licenses/APACHE_LICENSE_2.0.txt file. The full text of the MIT License is provided in the licenses/MIT_LICENSE.txt file.

Acknowledgments

  • Tiberius - Rust SQL Server driver (Apache License 2.0)
  • PyO3 - Python bindings for Rust (Apache License 2.0)
  • pyo3-asyncio - Async bridge for PyO3 (Apache License 2.0)
  • pytest - Python testing framework (MIT License)
  • pytest-asyncio - Async test support for pytest (MIT License)
  • black - Python code formatter (MIT License)
  • ruff - Python linter (MIT License)
  • Python and asyncio - Python standard library (Python Software Foundation License)
  • Maturin - Build tool for Python extensions in Rust

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

fastmssql-0.2.9-cp312-cp312-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.12Windows x86-64

fastmssql-0.2.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

fastmssql-0.2.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

fastmssql-0.2.9-cp312-cp312-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

fastmssql-0.2.9-cp312-cp312-macosx_10_9_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12macOS 10.9+ x86-64

fastmssql-0.2.9-cp311-cp311-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.11Windows x86-64

fastmssql-0.2.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

fastmssql-0.2.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

fastmssql-0.2.9-cp311-cp311-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

fastmssql-0.2.9-cp311-cp311-macosx_10_9_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

fastmssql-0.2.9-cp310-cp310-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.10Windows x86-64

fastmssql-0.2.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

fastmssql-0.2.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

fastmssql-0.2.9-cp310-cp310-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

fastmssql-0.2.9-cp310-cp310-macosx_10_9_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

fastmssql-0.2.9-cp39-cp39-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.9Windows x86-64

fastmssql-0.2.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

fastmssql-0.2.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

fastmssql-0.2.9-cp39-cp39-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

fastmssql-0.2.9-cp39-cp39-macosx_10_9_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

fastmssql-0.2.9-cp38-cp38-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.8Windows x86-64

fastmssql-0.2.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

fastmssql-0.2.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

fastmssql-0.2.9-cp38-cp38-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

fastmssql-0.2.9-cp38-cp38-macosx_10_9_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

File details

Details for the file fastmssql-0.2.9-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: fastmssql-0.2.9-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for fastmssql-0.2.9-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3ddef7543b23a0c04030fe56d739a01d1248ae5fc0a847f8bd96ce9a20cfe009
MD5 040c4bd83658866ee05b13db8fc72569
BLAKE2b-256 835c3d675e8b62a8a3f2aa2051d2aab48de5153f68229ed01d005fe8c3a371c5

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9a23c4a0032f528237c3461bf517996ffcbd6ddada6ca841ab338282603fd694
MD5 e2258c4e81589791eb5788bcefd3cc3f
BLAKE2b-256 8244e3b3cbae0a3232858d28e32ed69c075a93351ee89f52df3100a69f7f61bc

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5447fb16ac616b34e378374d7171709b20ded37eae72f6c7746f97e01be7228d
MD5 edbc2531a2b8510dc811d2f253e59ebe
BLAKE2b-256 4e1fb6c0e4f244af14675567dad5b6f59e1caed31d551c1bd9196a6e18539e3b

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6d4e0da5e98c088f60a3332ca095d934d658da0e1fa2c3038881230e17429952
MD5 e56ccedec6effbf16c45f9c028c7bc4b
BLAKE2b-256 265fd99d5d3297ee7948e455091e6bdc24d05f55f5508ac4be2ce10e43778b76

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp312-cp312-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp312-cp312-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e108406c364bcd37ca364e59d8ed8a1e90a999771d449a9f973548c57a3f1e70
MD5 5fdab167cd5276e3b5a80964b433885f
BLAKE2b-256 ae4d67491b8bcb5c5e4934cef1f3b903f6182b9c85f9a5033bc3471a6080e865

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: fastmssql-0.2.9-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for fastmssql-0.2.9-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ab2e2281016a6477c2f0507cde102f195bdae75764918399def2a76c882a7afe
MD5 9c7a60d92831929af60c2fca9df1166f
BLAKE2b-256 a592364868565fa72d7dcd44ae2324891ed4444b9f60eed023f89ae1fe0fbbf8

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2b909d295205f41299c9417dac1806cf118b08d87d222fdb2341d1bd1f4f5e46
MD5 95eaefbefdac9b3f3ecf13a98467beb9
BLAKE2b-256 3653863fdadd63c56f8d218fae17ba802909d4de81cc41383b1505b72f369df1

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 18d6e66491d95075342b5642908119355c71cd202e2f41ec5e17722b7511fa1a
MD5 86f77d707a196e7f0ec98824d968e44c
BLAKE2b-256 e762a17c0a1a232be2bffc0d08968aa47c70551497737a824d473104956fc3ed

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9cd5a0799259d5894ec23e62e52b2fcb808754f80527abdcdafe4b532cc44647
MD5 003941044833bb069ffd59e76dc0085b
BLAKE2b-256 d61618cf61bd4a26113850b323a3e974e902f0f8cbd02509dda1c96d27c4b23c

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b278e14cc8c4bd8432d122c74b5eb93d7fb60ce9b7d0257f24809353258f20c7
MD5 880983fce31203d0a3ef826a2c263b9d
BLAKE2b-256 50d6d820915fd78569d57b85be4cff1511f10d488a8244d9d2b9bea8ff76a901

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: fastmssql-0.2.9-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for fastmssql-0.2.9-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 262fc7a7a93fc46094250fb2151867899e1d8a07e206d112d9b31952da847d3d
MD5 d5eee7b7f3577577fb869982ae8109ba
BLAKE2b-256 0cfd1629395919eb298c5f9ff70086c15036aed7bf8b0d6eb84e6ca3f9b42c59

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a458c600aafaa1f8936f7c0fc78fde2683c448444aca33d898691d09d7c219f2
MD5 a8a6241eaf9f8ed864e4a40b3cbbec61
BLAKE2b-256 cebb5fc7fc9b1b2ebcb5b18c294faa3142696b5cab97cafdcfc780feee3daaa9

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 728f9f08a0b78dc3532b6c7351ebbec6d741c5b6e906bece2c56cee5eb5e9046
MD5 5d2fb1d7802367e6cb5e3d3710bd0930
BLAKE2b-256 925f8cc60ec83406244c75b34dd33b2a5720014ff635b94d1c6d58d91b3716c0

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2d95de3d3d8fc0bfdd6bff9896282b518b6ff6a7b0d5cdbcf0c281008ed4d56c
MD5 1680e6abf5fd2367a1f60d279487dbec
BLAKE2b-256 980a375e2541ef17d33b0569417e010bff49576bda61f21728a36858e26bf6f7

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 754b4f53b2359fea3f976aeffabe3771bf074990687e6c8c1065aabe5c476e75
MD5 499e8ec58c2aaf8e0eeedad7e3a2e4ae
BLAKE2b-256 33c744adad61eedee5ba8127799cce204be5132675148bfca4108c712c22fffc

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: fastmssql-0.2.9-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for fastmssql-0.2.9-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 ac3102aa4163411a11a74345a2cf4ebca0bf3872f256ebbaed8ff20f9b6e6c1b
MD5 0e14c1327fad796b9f149fe2273b7992
BLAKE2b-256 a267671a3b6d8e0dfd7448e4712d3cb80062c70cbbd8cbe1441565dffbb1b776

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5d8453c4a4c0d53303279e40390785377518b6bd6f21b547ddf88c308a9b66f7
MD5 fa23ffa79ace7784aee2a47541afb11a
BLAKE2b-256 1fd16c41019cb36816f3387a150bba1971e20df9c7996b232dee2fa7cd530306

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6136afdc17aeb12b312e3aec7de7477982aa851c6edef8dca845d7f8dcebb328
MD5 48f2e1851539070f92d498c19ba65eb6
BLAKE2b-256 04548511efa008c9a974602c04ae2f04339deb01e4acacce504bc52e8a16246b

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b4a9191e93389e4eeca02f030c6297d104c3393b1a2ebc43deaef59c89e1840a
MD5 a1ea0e795fc53d8b686acfcce05ab435
BLAKE2b-256 5953d5653ede5a65ba1ae97c414429435f07cee39f18739aeb1343a64dbe8fbc

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a3a61beb658074849d6a087824a7fff5466e4f2d3fcb0a40462db23f66eed669
MD5 42cf922c002e44c7dd8119e666742153
BLAKE2b-256 7938fcb8e23df89401a90f8eba57180668db1454c38b03221c9003d5ca53e54d

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: fastmssql-0.2.9-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for fastmssql-0.2.9-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 1e9e68bfdda81a13c6760463a959383ae4d6ecb61c2d84389a4e7a2105e38ec4
MD5 76074f72eaa997b5ab65d44381284f7f
BLAKE2b-256 eb681fa9c0e8becfd2df2bcd606202244956151e3c20bab63171e3f01eee41f4

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ad4802b7c2031e9b866d68b2c48577d236c729179019a36832f10fb98971863d
MD5 4ffd68ffa5566bfc02464be1f128e14e
BLAKE2b-256 304d516544a39d4b0055048ba31fc9edbe61e3791cfdb5ab543e6f47284d419e

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 3511e8ec5f676eb790e9e9f507bda8c3c4f854ff776c5d877efc41f928156c2b
MD5 3d910141af6c3a305beb57e18a6af6da
BLAKE2b-256 48ef90c52766043fd0964f526d631edf4f30a91880bc245692354f920fc360c3

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e1aad65ddd2dbe4fa889640adc7eeb266baac16d77be9af99e8c79a268f6595e
MD5 1d8c05c3630e7ab41f32377b9c92aba1
BLAKE2b-256 f8da28fc3ceda60885cb686f9fd6161a00e023fdf4de9e1bd74444c36cbcb918

See more details on using hashes here.

File details

Details for the file fastmssql-0.2.9-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.2.9-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d8688221397eb32fbf69107557dc80d49069138f639452ee131aac1116ee1010
MD5 f17e3864ef986f505e2c46b5253a43b4
BLAKE2b-256 a8a618e713b39703c434f36321f454a3c2ddbce470a599a3b78e6a719769cbf9

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