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

FastMSSQL is available under your choice of two licenses:

Option 1: GNU General Public License v3.0 (GPL-3.0)

Free for open source projects. If you distribute your application, you must make your entire application open source under GPL-3.0.

Option 2: Commercial License

Paid license for proprietary applications. Allows you to keep your application closed source. Contact riverb514@gmail.com for commercial licensing.

See the LICENSE file for full GPL-3.0 terms and commercial licensing details.

Examples and Benchmarks

  • Examples Directory: All files in the examples/ directory are licensed under the MIT License. See examples/LICENSE for full terms.
  • Benchmarks Directory: All files in the benchmarks/ directory are licensed under the MIT License. See licenses/MIT_LICENSE.txt for full terms.

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.3.0-cp313-cp313-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.13Windows x86-64

fastmssql-0.3.0-cp313-cp313-manylinux_2_28_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

fastmssql-0.3.0-cp313-cp313-manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

fastmssql-0.3.0-cp313-cp313-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

fastmssql-0.3.0-cp313-cp313-macosx_10_13_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

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

Uploaded CPython 3.12Windows x86-64

fastmssql-0.3.0-cp312-cp312-manylinux_2_28_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

fastmssql-0.3.0-cp312-cp312-manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

fastmssql-0.3.0-cp312-cp312-macosx_10_13_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

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

Uploaded CPython 3.11Windows x86-64

fastmssql-0.3.0-cp311-cp311-manylinux_2_28_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

fastmssql-0.3.0-cp311-cp311-manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

fastmssql-0.3.0-cp311-cp311-macosx_10_12_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

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

Uploaded CPython 3.10Windows x86-64

fastmssql-0.3.0-cp310-cp310-manylinux_2_28_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

fastmssql-0.3.0-cp310-cp310-manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.10macOS 11.0+ ARM64

fastmssql-0.3.0-cp310-cp310-macosx_10_12_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

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

Uploaded CPython 3.9Windows x86-64

fastmssql-0.3.0-cp39-cp39-manylinux_2_28_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ x86-64

fastmssql-0.3.0-cp39-cp39-manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.9macOS 11.0+ ARM64

fastmssql-0.3.0-cp39-cp39-macosx_10_12_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.9macOS 10.12+ x86-64

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

Uploaded CPython 3.8Windows x86-64

fastmssql-0.3.0-cp38-cp38-manylinux_2_28_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.28+ x86-64

fastmssql-0.3.0-cp38-cp38-manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.8macOS 11.0+ ARM64

fastmssql-0.3.0-cp38-cp38-macosx_10_12_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.8macOS 10.12+ x86-64

File details

Details for the file fastmssql-0.3.0-cp313-cp313-win_amd64.whl.

File metadata

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

File hashes

Hashes for fastmssql-0.3.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ab8577d14c42c7ddac78d1d566ca7ec873054b6b32428e356bd454557e0de938
MD5 72d9f8ebb21536f3953da1193243e690
BLAKE2b-256 b755f7455096cb643c24f9ed7bea78e6dfe6c4c4f4c01c18d810d0504a8ec2a0

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7bac9b985ec936d5cb7f4622f3b0e8cd05b2cfd231ce77929a8845fda358218c
MD5 b896c5d7bc9506ee4a3bc2defffef14d
BLAKE2b-256 315c654643a53c69e18ed3e98f0a10b42e6c8d857c5aa7f3cf41a37e93224268

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp313-cp313-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 dd4df82ee7289d00f9fe89d76932252f2147cd92691d94c2738051330f3e0c4a
MD5 fcc136c80a93c2196a76551426ea748a
BLAKE2b-256 d8dad002e2b6ca976422bb5ad9f1137b348899157e7200c4a4bd579e5f35db23

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ca83be9ee52a7ef7ef8c5eb039b579e98eff03161cc8b5ceecb6d2ddad9df8f5
MD5 a2fa766845c7502a7523135293007ac0
BLAKE2b-256 b4a3ebfc7e1082bb925b84b9b6af8c8dbad7ed9dd7eac7345e24b1de4dbe1713

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 f1acf27dc2e4a9b6a8cfd2d6d6a58ca819060d537c236b4d10b1b8c7a6126f89
MD5 2a15a3ec8f2db542db73ec45493304a9
BLAKE2b-256 4136b096f56e3a29f836bfc352ef83ca08600c6c301d3d0aed5fc884d43f54b7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fastmssql-0.3.0-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.3.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d9a6b8ca3c3c35bda077640e63cec9a1d74e1bf439b05cbbd5407a117580309e
MD5 617e86a2dfb4068cf587e1922c47b658
BLAKE2b-256 d69896b9ecde24074005764afb87fa6f3898397420379c441896058c203c9221

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2bcfbe9e4ef81f11f32d068d742a9f518b211785b5df447faf2362d2b638fe41
MD5 7f5d5c001be34ce5224b0ba0a870f2cb
BLAKE2b-256 1a2b6659fc98e00649dd6c5a2e2f4b887faa48e283fd63574351acba270eb977

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 31ee8b769aaf234385a324ecc62c1411eab7fd729f0d04832b5b1a59c216c92a
MD5 d73db3641a883de9a417fc493f1aeae9
BLAKE2b-256 f45cd1dc317b902dfd06b6372b5f61640b27723620a72419112694e9cad42cf6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 744d454bdd0ee9a831dee88fdaa36596a4b62b679385f52d84f31054e8c1f0c5
MD5 98f08939ccc0bd1db68accd9c898e4a8
BLAKE2b-256 403f70ccb1c7b6880b085a54ef28aa5e4d74c6f37a1223024950cad57adc2b55

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 46ac396c6f3ce5fa95ef65c785b8d7285da0afa98ee3353f5b9417392485397b
MD5 3eeea864723aa3efc4811f4a6eeccb8d
BLAKE2b-256 b847dd0d9563fa77497f0db6038b7ee2b5b8935f997ccfe7f9d5b3d5c09ed8a3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fastmssql-0.3.0-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.3.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9524a96bc64ee3ce91d7cefa5c03e70b2661a76617896887570bbd33851a0bc7
MD5 ecff9d6ce4137b4e7676cfb8c987f12e
BLAKE2b-256 8da74b1e332f8527cfabbab185790b6cac6d736a361e1c07fbffd702e4049276

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e68dc5c219c49184e7e1cb6be7ca4250ccdc715d047532f46865ca54d02048be
MD5 2d7752c9ad995580d501550891e2e638
BLAKE2b-256 b07a3c0bb3f7811ada16ed11c355f5f425804e9b9a6223d2709a99ff150e4121

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp311-cp311-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 41f78b42a635e6f00598c36e6d54613fb23c62368f4df821cb470c3dbf8d97fd
MD5 bf98c7f7806963d2f1bfbe6046415d40
BLAKE2b-256 2ea84d0e98fabccd3db7da1b52c49a517aef1bd8388f6f0c1d7e6fafeca304ef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0f7eaa570fb88281c405801eb79c6f1f0059a0bed11509ed69f881a92f3d4da6
MD5 342105fe2c4165ea22417c9b6b29ea94
BLAKE2b-256 f3d30061ddc8e87d1d10dd480646919e36378a9fe34917e837c586be7d8471eb

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e88e7a5892cbbf67ecc8c92f2aba6fe6b94e30c9b9ae5c8ca8ef3039b4d300df
MD5 44680f3deddf6b78883de71f03ccf335
BLAKE2b-256 7931551cbfb424423fe15efcac072b16552c67b00bbf2d47c9d6b6ad0f7405ad

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fastmssql-0.3.0-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.3.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 55ec37cdd8239ea409c9712d46f76cc5d23a79eb46ab8b3cfbc851a2fdd303b9
MD5 3694b4090d079f48f87636bf41e59ec6
BLAKE2b-256 b6bb8e58a1cff5dc9b84af3791f5b43aac1d2b866abc02608f583058b5a6333d

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e45ee37dccf03124be10f0dcacfc91da9b5280a4e0e1b78e07f4d28019d7d572
MD5 41bf10777674e5f6a0c9c7b22103a2de
BLAKE2b-256 3f873fd1a3ec80ca1d39ce5585ccd1a4782cf7d8605a23405a7f171ddb451535

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp310-cp310-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 dfaaf974b744596d0318a6f3804758d71f5b8487209cdd64276338dc601d6f8e
MD5 298a21d80f22cb49de889a490c4e09ab
BLAKE2b-256 c8eeb05000c04558fd2f78f12d435f7b95b97bf3ce644e08867f143490b7546c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 408c927df328295a69c93d706c0f7de9e00ef34012db75a2dea13a023a2ad1c1
MD5 236224816fab76ca263f1de1cf5bfba0
BLAKE2b-256 8ac99e2c63695c3ecfbd7685b704aaa86b7efaf733d770d6c0f960d7359481c7

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 06c0406a10deb29c4274eb5ab5f57eacd32d12eb916707ffc724d2b8275dbaaf
MD5 4698d7fb04db6f94119ad41ac973b50b
BLAKE2b-256 17dc8ec91378097992b6652d1e5f353832ddf33c4608702b02185d9f5887a77e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fastmssql-0.3.0-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.3.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 956269fb1751db06b72c0362ea2e3c74e3939f0ae57a1f10b4d5697bef151ad1
MD5 635222ebabf873764b9e0b514e4bdbcb
BLAKE2b-256 f4d55fc0fa7aa94be6004cde39311553b990f2842f6406d25418d198fba07d17

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp39-cp39-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8ce9217e5f719055629e7856c37669d3e4bde296fa1cafe6218dafd76469ebfd
MD5 8a7d8c94f426b3d2849a896e58d02982
BLAKE2b-256 871a0dc7e7d271fa0902a16d0c4e57b786c27c28f1fade395893bd20bbee891f

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp39-cp39-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp39-cp39-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 fd53f07390fe19b0556ac24d8bc3b4bb9eb1ca41d554ff66166b3994c90b6c47
MD5 0af52206cb6f7e7a142f4f80b0a72417
BLAKE2b-256 3898ce7a7f407ce5c5d202344ce9b60a2ec3faf1e24b055a03162c73eb87e75e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1a6a008d1c83f66dc9b326cd99eeb5a736b3240823de0b499a5d171761f3cfd9
MD5 ae9c057406b37f98dd74feb1b3d034b9
BLAKE2b-256 465b273a6711cf8766c9bfc75078e5f46bc2884a7377a9788fd7b4dca23b43a8

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp39-cp39-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 2f382625d53563ec2dcb1ded186c5ca1ccac0deb3d052568b0b1adb64e5166c9
MD5 163a33316f13aa01566bceca268b4d7d
BLAKE2b-256 7567c6d847e26c4ddaa4429a20db9e4632f7aaf917abb62621b4a75aacac822e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fastmssql-0.3.0-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.3.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 afc79fcd36d866be8588e625ffe13f36dc9c80e13076fa4027aea65a1b1dcadd
MD5 ab56cb1e001154a06a572d2d1ae6d99d
BLAKE2b-256 90a459aaef65dcb26bdd79d3f3c59408a69b6f909d5bcb9668a1b52feb8901e9

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp38-cp38-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp38-cp38-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b70fcaef625ef1660bc6ec64245dbf3c3884cacd8b0cf68b3f63515d4cd31c1c
MD5 cbf33687710216931061049d44dc3e3f
BLAKE2b-256 7c0eca76e0a0b109283be752d30ca40669c1dba70ab4f9c8195bc7d2dadfd898

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp38-cp38-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp38-cp38-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 16f177957ccdeed786f7b5aa53a29aa58715f1c537ad4c613ca8486a4499f08c
MD5 1494c3e1f3da8f3cc24649b1309e62a5
BLAKE2b-256 67a8e9881eccd5554532e68442dae8284db26262fadf4874b0c55ec862b4176a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b2debc25b5b90f8b7b700859b408434ab5b899bfbc3a50f1c2aa15c71f5aaf2d
MD5 7c3eff1d38827f60dd09eff0d0548d0a
BLAKE2b-256 c37bb5f76af315e2ed0825c35fe99e57734157a80db82e2f09a6936f74b7596d

See more details on using hashes here.

File details

Details for the file fastmssql-0.3.0-cp38-cp38-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for fastmssql-0.3.0-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 7bf8972d1f85e83cd8a0ee44e746b3156a6f6b19cf8e28865173007be52c4574
MD5 17df850ac8e5682b9fb6f1a632486a5c
BLAKE2b-256 ee2f9f6dc809115dc66748f2da02f7f4e22678b881a4e723c9929d61b04256f0

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