fastmssql 0.2.7__cp310-cp310-win_amd64.whl → 0.3.2__cp310-cp310-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of fastmssql might be problematic. Click here for more details.

@@ -1,687 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: fastmssql
3
- Version: 0.2.7
4
- Classifier: Development Status :: 4 - Beta
5
- Classifier: Intended Audience :: Developers
6
- Classifier: License :: Other/Proprietary License
7
- Classifier: Programming Language :: Python :: 3
8
- Classifier: Programming Language :: Python :: 3.8
9
- Classifier: Programming Language :: Python :: 3.9
10
- Classifier: Programming Language :: Python :: 3.10
11
- Classifier: Programming Language :: Python :: 3.11
12
- Classifier: Programming Language :: Python :: 3.12
13
- Classifier: Programming Language :: Python :: 3.13
14
- Classifier: Programming Language :: Rust
15
- Classifier: Topic :: Database
16
- Classifier: Topic :: Software Development :: Libraries :: Python Modules
17
- Requires-Dist: pytest>=7.0 ; extra == 'dev'
18
- Requires-Dist: pytest-asyncio>=0.21 ; extra == 'dev'
19
- Requires-Dist: psutil>=5.9.0 ; extra == 'dev'
20
- Provides-Extra: dev
21
- License-File: LICENSE
22
- Summary: A high-performance Python library for Microsoft SQL Server using Rust and Tiberius
23
- Author-email: Riveranda <riverb514@gmail.com>
24
- License: PolyForm Noncommercial License 1.0.0
25
- Requires-Python: >=3.8
26
- Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
27
- Project-URL: Homepage, https://github.com/Rivendael/pymssql-rs
28
-
29
-
30
- # Fastmssql ⚡
31
-
32
- A Python library for Microsoft SQL Server built with Rust using the [Tiberius](https://github.com/prisma/tiberius) driver, [PyO3](https://github.com/PyO3/pyo3), and [bb8](https://github.com/djc/bb8) connection pooling.
33
-
34
- [![Language](https://img.shields.io/badge/Language-Rust_Backend-red)](https://github.com/Rivendael/pymssql-rs)
35
- [![Async](https://img.shields.io/badge/Async-Native_Tokio-blue)](https://github.com/Rivendael/pymssql-rs)
36
- [![Performance](https://img.shields.io/badge/Performance-17%2C800%2B_RPS-brightgreen)](https://github.com/Rivendael/pymssql-rs)
37
-
38
- ## Features
39
-
40
- - **High Performance**: Exceptional throughput with 17,800+ RPS capability
41
- - **Rust-Powered Backend**: Built with Rust for memory safety and reliability
42
- - **No ODBC Required**: Direct native SQL Server connection without ODBC drivers
43
- - **Connection Pooling**: Intelligent bb8-based connection pooling (default: 75 max, 25 min idle)
44
- - **Async-Only Design**: Built on Tokio with clean async/await API
45
- - **Context Managers**: Automatic resource management with `async with`
46
- - **Type Safety**: Strong typing with automatic Python type conversion
47
- - **Thread Safety**: Support for concurrent operations
48
- - **Cross-Platform**: Works on Windows, macOS, and Linux
49
- - **Simple API**: Clean, intuitive async-only interface
50
-
51
- ## Performance Highlights
52
-
53
- Fastmssql delivers exceptional database performance through Rust-powered architecture:
54
-
55
- - **Outstanding Throughput**: Up to **17,800+ RPS** with multiple connection pattern
56
- - **High Performance**: **5,000+ RPS** with single connection (default usage)
57
- - **Low Latency**: ~2ms average query latency under high load
58
- - **Scalable Architecture**: Linear scaling with multiple connection objects
59
- - **Production Ready**: Stable API with comprehensive error handling
60
- - **Connection Pooling**: Efficient resource management with configurable pools
61
- - **Type Conversion**: Automatic conversion between SQL Server and Python types
62
- - **SSL/TLS Support**: Secure connections with flexible encryption options
63
-
64
- ### Performance Benchmarks
65
-
66
- | Pattern | RPS | Configuration | Use Case |
67
- |---------|-----|---------------|----------|
68
- | Single Connection (Default) | **5,000+** | Default pool (75/25) | Standard applications |
69
- | Multiple Connections | **17,800+** | 50 workers, high_throughput() | High-concurrency scenarios |
70
- | Conservative Load | 3,500+ | Shared connection | Traditional pooling |
71
-
72
- **Benchmark Environment:**
73
- - Database: SQL Server (local instance)
74
- - Query: `SELECT 1` (minimal overhead)
75
- - Test Duration: 15-30 seconds per test
76
- - Hardware: Modern development machine
77
-
78
- **Key Performance Insights:**
79
- 1. **Multiple Connection Objects**: Creating separate `Connection()` objects eliminates serialization bottlenecks
80
- 2. **Pool Configuration**: Use `PoolConfig.high_throughput()` for demanding workloads
81
- 3. **Optimal Worker Count**: 30-50 concurrent workers provides best throughput
82
- 4. **Tokio Optimization**: Aggressive threading configuration maximizes async performance
83
-
84
- ## Installation
85
-
86
- ### From PyPI (Recommended)
87
-
88
- Install fastmssql using pip:
89
-
90
- ```bash
91
- pip install fastmssql
92
- ```
93
-
94
- ### Prerequisites
95
-
96
- - Python 3.8 to 3.13
97
- - Microsoft SQL Server (any recent version)
98
-
99
- ### From Source (Development)
100
- Ensure you have Docker, Rust, and Python installed.
101
- If you want to build from source or contribute to development:
102
-
103
- 1. Clone the repository:
104
- ```bash
105
- git clone <your-repo-url>
106
- cd mssql-python-rust
107
- ```
108
-
109
- 2. Run the setup script
110
- ```
111
- ./setup.sh
112
- ```
113
-
114
- ## Quick Start
115
-
116
- ### Basic Async Usage (Recommended)
117
-
118
- ```python
119
- import asyncio
120
- from fastmssql import Connection
121
-
122
- async def main():
123
- # Connect to SQL Server using async context manager
124
- connection_string = "Server=localhost;Database=master;User Id=myuser;Password=mypass"
125
-
126
- # Automatic connection pool management
127
- async with Connection(connection_string) as conn:
128
- rows = await conn.execute("SELECT @@VERSION as version")
129
- for row in rows:
130
- print(row['version'])
131
-
132
- # Pool statistics
133
- stats = conn.pool_stats()
134
- print(f"Pool: {stats['active_connections']}/{stats['connections']} connections active")
135
-
136
- asyncio.run(main())
137
- ```
138
-
139
- ### Connection Methods
140
-
141
- The library supports two ways to connect to SQL Server:
142
-
143
- #### 1. Connection String (Traditional)
144
-
145
- ```python
146
- import asyncio
147
- from fastmssql import Connection
148
-
149
- async def main():
150
- # Traditional connection string approach
151
- connection_string = "Server=localhost;Database=master;User Id=myuser;Password=mypass"
152
-
153
- async with Connection(connection_string=connection_string) as conn:
154
- result = await conn.execute("SELECT @@VERSION as version")
155
- for row in result.rows():
156
- print(row['version'])
157
-
158
- asyncio.run(main())
159
- ```
160
-
161
- #### 2. Individual Parameters
162
-
163
- ```python
164
- import asyncio
165
- from fastmssql import Connection
166
-
167
- async def main():
168
- # Using individual connection parameters
169
-
170
- # SQL Server Authentication
171
- async with Connection(
172
- server="localhost",
173
- database="master",
174
- username="myuser",
175
- password="mypassword"
176
- ) as conn:
177
- result = await conn.execute("SELECT SUSER_NAME() as login")
178
- for row in result.rows():
179
- print(f"Logged in as: {row['login']}")
180
-
181
- asyncio.run(main())
182
- ```
183
-
184
- ### Performance Patterns
185
-
186
- For maximum performance in high-concurrency scenarios, create multiple Connection objects:
187
-
188
- ```python
189
- import asyncio
190
- from fastmssql import Connection, PoolConfig
191
-
192
- async def high_performance_pattern():
193
- """Optimal pattern for maximum throughput."""
194
- connection_string = "Server=localhost;Database=master;User Id=myuser;Password=mypass"
195
- config = PoolConfig.high_throughput() # Optimized settings
196
-
197
- async def worker():
198
- # Each worker gets its own Connection object for maximum throughput
199
- async with Connection(connection_string, pool_config=config) as conn:
200
- for _ in range(1000):
201
- # Use proper SQL Server parameterization with @param syntax
202
- result = await conn.execute("SELECT data FROM my_table WHERE id = @id", {"id": 123})
203
- # Process results...
204
-
205
- # Launch multiple workers - each with their own connection
206
- workers = [asyncio.create_task(worker()) for _ in range(50)]
207
- await asyncio.gather(*workers)
208
-
209
- # This pattern can achieve 17,800+ RPS
210
-
211
- asyncio.run(high_performance_pattern())
212
- ```
213
-
214
- **Key Performance Insight**: While a single Connection object provides excellent performance (5,000+ RPS),
215
- creating multiple Connection objects eliminates serialization bottlenecks and can achieve 17,800+ RPS
216
- for maximum throughput scenarios.
217
-
218
- ### Connection Pool Configuration
219
-
220
- Configure the connection pool for your specific needs:
221
-
222
- ```python
223
- import asyncio
224
- from fastmssql import Connection, PoolConfig
225
-
226
- async def main():
227
- # Custom pool configuration
228
- pool_config = PoolConfig(
229
- max_size=20, # Maximum connections in pool
230
- min_idle=5, # Minimum idle connections
231
- max_lifetime_secs=3600, # Connection max lifetime (1 hour)
232
- idle_timeout_secs=600, # Idle connection timeout (10 min)
233
- connection_timeout_secs=30 # Max wait time for connection
234
- )
235
-
236
- async with Connection(connection_string, pool_config) as conn:
237
- result = await conn.execute("SELECT * FROM users")
238
-
239
- # Predefined configurations for different scenarios
240
- high_throughput_config = PoolConfig.high_throughput() # 100 connections, optimized for high RPS
241
- maximum_performance = PoolConfig.maximum_performance() # 150 connections, optimized for peak load
242
- low_resource_config = PoolConfig.low_resource() # 3 connections, minimal resources
243
- dev_config = PoolConfig.development() # 5 connections, shorter timeouts
244
-
245
- # Default configuration is optimized for high performance
246
- # Default: max_size=75, min_idle=25 - ready for production workloads
247
-
248
- # For maximum throughput, use multiple Connection objects:
249
- async def high_perf_worker():
250
- async with Connection(connection_string, maximum_performance) as conn:
251
- result = await conn.execute("SELECT * FROM fast_table")
252
- return result.rows()
253
-
254
- # Each worker gets its own connection for optimal performance
255
- tasks = [asyncio.create_task(high_perf_worker()) for _ in range(50)]
256
- results = await asyncio.gather(*tasks)
257
-
258
- asyncio.run(main())
259
- ```
260
-
261
-
262
-
263
- ### Connection Strings
264
-
265
- The library supports standard SQL Server connection string formats:
266
-
267
- ```python
268
- # SQL Server Authentication
269
- conn_str = "Server=localhost;Database=MyDB;User Id=sa;Password=MyPassword"
270
-
271
- # With specific port
272
- conn_str = "Server=localhost,1433;Database=MyDB;User Id=myuser;Password=mypass"
273
-
274
- # Azure SQL Database
275
- conn_str = "Server=tcp:myserver.database.windows.net,1433;Database=MyDB;User Id=myuser;Password=mypass;Encrypt=true"
276
- ```
277
-
278
- ### Working with Data
279
-
280
- ```python
281
- import asyncio
282
- from fastmssql import Connection
283
-
284
- async def main():
285
- async with Connection(connection_string) as conn:
286
- # Execute queries
287
- users = await conn.execute("SELECT id, name, email FROM users WHERE active = 1")
288
-
289
- # Iterate through results
290
- for user in users:
291
- print(f"User {user['id']}: {user['name']} ({user['email']})")
292
-
293
- # Execute non-query operations
294
- rows_affected = await conn.execute_non_query(
295
- "UPDATE users SET last_login = GETDATE() WHERE id = 123"
296
- )
297
- print(f"Updated {rows_affected} rows")
298
-
299
- # Work with different data types
300
- data = await conn.execute("""
301
- SELECT
302
- 42 as int_value,
303
- 3.14159 as float_value,
304
- 'Hello World' as string_value,
305
- GETDATE() as datetime_value,
306
- CAST(1 as BIT) as bool_value,
307
- NULL as null_value
308
- """)
309
-
310
- row = data[0]
311
- for column_name, value in row.items():
312
- print(f"{column_name}: {value} (type: {type(value).__name__})")
313
-
314
- asyncio.run(main())
315
- ```
316
-
317
- ## Usage
318
-
319
- ### Asynchronous Usage with Connection Pooling
320
-
321
- Full async/await support with automatic connection pool management:
322
-
323
- ```python
324
- import asyncio
325
- from fastmssql import Connection
326
-
327
- async def main():
328
- connection_string = "Server=localhost;Database=test;Integrated Security=true"
329
-
330
- # Async context manager with automatic pool management
331
- async with Connection(connection_string) as conn:
332
- rows = await conn.execute("SELECT name FROM sys.databases")
333
- for row in rows:
334
- print(row['name'])
335
-
336
- # Pool statistics
337
- stats = conn.pool_stats()
338
- print(f"Pool: {stats['active_connections']}/{stats['connections']} connections active")
339
-
340
- # High-performance concurrent operations
341
- async def fetch_user_data(user_id):
342
- async with Connection(connection_string) as conn:
343
- return await conn.execute(f"SELECT * FROM users WHERE id = {user_id}")
344
-
345
- # Execute multiple queries concurrently using the connection pool
346
- user_ids = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
347
- tasks = [fetch_user_data(uid) for uid in user_ids]
348
- results = await asyncio.gather(*tasks) # bb8 pool handles concurrent connections efficiently
349
-
350
- for user_data in results:
351
- if user_data:
352
- print(f"User: {user_data[0]['name']}")
353
-
354
- asyncio.run(main())
355
- ```
356
-
357
- ## Development
358
-
359
- ### Building from Source
360
-
361
- ```bash
362
- # Install development dependencies
363
- pip install maturin pytest pytest-asyncio black ruff
364
-
365
- # Build in development mode
366
- maturin develop
367
-
368
- # Run tests
369
- python -m pytest tests/
370
-
371
- # Format code
372
- black python/
373
- ruff check python/
374
- ```
375
-
376
- ### Project Structure
377
-
378
- ```
379
- mssql-python-rust/
380
- ├── src/ # Rust source code
381
- │ ├── lib.rs # Main library entry point
382
- │ ├── connection.rs # Connection handling
383
- │ ├── query.rs # Query execution
384
- │ └── types.rs # Type definitions
385
- ├── python/ # Python source code
386
- │ ├── __init__.py # Main Python module
387
- │ ├── mssql.py # High-level API
388
- │ └── types.py # Python type definitions
389
- ├── examples/ # Usage examples
390
- ├── tests/ # Test files
391
- ├── Cargo.toml # Rust dependencies
392
- ├── pyproject.toml # Python project configuration
393
- └── README.md # This file
394
- ```
395
-
396
- ### Testing
397
-
398
- Run the examples to test your installation:
399
-
400
- ```bash
401
- # Basic functionality
402
- python examples/basic_usage.py
403
-
404
- # Advanced features
405
- python examples/advanced_usage.py
406
- ```
407
-
408
- ## API Reference
409
-
410
- ### Core Classes
411
-
412
- #### `Connection`
413
- Main connection class with bb8 connection pool management.
414
-
415
- **Constructor:**
416
- ```python
417
- Connection(connection_string: str, pool_config: Optional[PoolConfig] = None)
418
- ```
419
-
420
- **Context Manager Support:**
421
- ```python
422
- # Synchronous
423
- with Connection(conn_str) as conn:
424
- result = conn.execute("SELECT * FROM table")
425
-
426
- # Asynchronous
427
- async with Connection(conn_str) as conn:
428
- result = await conn.execute_async("SELECT * FROM table")
429
- ```
430
-
431
- **Methods:**
432
- - `execute(sql: str) -> List[Row]` - Execute a query synchronously
433
- - `pool_stats() -> dict` - Get connection pool statistics
434
- - `disconnect()` - Close the connection pool
435
- - `is_connected() -> bool` - Check if pool is active
436
-
437
- **Pool Statistics:**
438
- ```python
439
- stats = conn.pool_stats()
440
- # Returns: {
441
- # 'connections': 10, # Total connections in pool
442
- # 'active_connections': 3, # Currently active connections
443
- # 'idle_connections': 7 # Available idle connections
444
- # }
445
- ```
446
-
447
- #### `PoolConfig`
448
- Configuration class for bb8 connection pool settings.
449
-
450
- **Constructor:**
451
- ```python
452
- PoolConfig(
453
- max_size: int = 10, # Maximum connections in pool
454
- min_idle: int = 0, # Minimum idle connections
455
- max_lifetime_secs: Optional[int] = None, # Connection max lifetime
456
- idle_timeout_secs: Optional[int] = None, # Idle connection timeout
457
- connection_timeout_secs: int = 30 # Max wait time for connection
458
- )
459
- ```
460
-
461
- **Predefined Configurations:**
462
- ```python
463
- # High throughput applications (web servers, APIs)
464
- config = PoolConfig.high_throughput() # 20 connections, optimized settings
465
-
466
- # Low resource environments (embedded, containers)
467
- config = PoolConfig.low_resource() # 3 connections, minimal overhead
468
-
469
- # Development environments
470
- config = PoolConfig.development() # 5 connections, shorter timeouts
471
- ```
472
-
473
- #### `Row`
474
- Represents a database row with column access.
475
-
476
- **Methods:**
477
- - `get(column: str) -> Value` - Get value by column name
478
- - `get_by_index(index: int) -> Value` - Get value by column index
479
- - `columns() -> List[str]` - Get column names
480
- - `values() -> List[Value]` - Get all values
481
- - `to_dict() -> dict` - Convert to dictionary
482
-
483
- ### Module Functions
484
-
485
- #### Connection Management
486
- ```python
487
- # Create connection with default pool settings
488
- connect(connection_string: str) -> Connection
489
-
490
- # Create async connection with default pool settings
491
- connect_async(connection_string: str) -> Connection
492
-
493
- # One-liner query execution
494
- execute(connection_string: str, sql: str) -> List[dict]
495
- execute_async(connection_string: str, sql: str) -> List[dict]
496
- ```
497
-
498
- #### Utility Functions
499
- ```python
500
- version() -> str # Get library version
501
- ```
502
-
503
- ### Connection Pool Architecture
504
-
505
- The library uses the bb8 connection pool for efficient resource management:
506
-
507
- 1. **Pool Initialization**: Creates a pool of reusable connections on first use
508
- 2. **Connection Reuse**: Automatically reuses idle connections for new requests
509
- 3. **Load Balancing**: Distributes connections across concurrent operations
510
- 4. **Automatic Cleanup**: Closes idle connections based on timeout settings
511
- 5. **Thread Safety**: Safe for use across multiple threads and async tasks
512
-
513
- ### Error Handling
514
-
515
- ```python
516
- try:
517
- async with mssql.connect_async(connection_string) as conn:
518
- result = await conn.execute("SELECT * FROM invalid_table")
519
- except Exception as e:
520
- print(f"Database error: {e}")
521
- # Connection automatically returned to pool even on error
522
- ```
523
-
524
- ## Migration to Async-Only Architecture
525
-
526
- This library has been upgraded to use async-only operations with the bb8 connection pool for improved performance and reliability.
527
-
528
- **Async-Only API:**
529
- ```python
530
- # Async-only with automatic connection pooling
531
- async with mssql.connect_async(conn_str) as conn:
532
- result = await conn.execute("SELECT * FROM table")
533
-
534
- # Pool statistics
535
- stats = conn.pool_stats()
536
- print(f"Pool utilization: {stats['active_connections']}/{stats['connections']}")
537
- ```
538
-
539
- ## Advanced Usage Patterns
540
-
541
- ### Custom Pool Configuration for Different Scenarios
542
-
543
- ```python
544
- from fastmssql import Connection, PoolConfig
545
-
546
- # High-load web application
547
- web_config = PoolConfig(
548
- max_size=50, # Handle many concurrent requests
549
- min_idle=10, # Keep connections ready
550
- max_lifetime_secs=1800, # 30 min connection lifetime
551
- idle_timeout_secs=300, # 5 min idle timeout
552
- connection_timeout_secs=10 # Fast timeout for web responses
553
- )
554
-
555
- # Batch processing application
556
- batch_config = PoolConfig(
557
- max_size=5, # Fewer connections
558
- min_idle=2, # Always keep some ready
559
- max_lifetime_secs=7200, # 2 hour lifetime for long operations
560
- idle_timeout_secs=1800, # 30 min idle timeout
561
- connection_timeout_secs=60 # Longer timeout for batch work
562
- )
563
-
564
- # Microservice with limited resources
565
- micro_config = PoolConfig(
566
- max_size=3, # Minimal connections
567
- min_idle=1, # One always ready
568
- max_lifetime_secs=3600, # 1 hour lifetime
569
- idle_timeout_secs=600, # 10 min idle timeout
570
- connection_timeout_secs=15 # Quick timeout
571
- )
572
- ```
573
-
574
- ### Monitoring Pool Health
575
-
576
- ```python
577
- async def monitor_database_pool():
578
- """Monitor connection pool health and performance"""
579
-
580
- async with mssql.connect_async(connection_string) as conn:
581
- while True:
582
- stats = conn.pool_stats()
583
- utilization = stats['active_connections'] / stats['connections'] * 100
584
-
585
- print(f"Pool Utilization: {utilization:.1f}%")
586
- print(f"Active: {stats['active_connections']}, Idle: {stats['idle_connections']}")
587
-
588
- # Alert if pool utilization is too high
589
- if utilization > 90:
590
- print("WARNING: High pool utilization detected!")
591
-
592
- await asyncio.sleep(30) # Check every 30 seconds
593
- ```
594
-
595
- ### Optimizing for Different Database Workloads
596
-
597
- ```python
598
- # OLTP (Online Transaction Processing) - Many small, fast queries
599
- oltp_config = PoolConfig.high_throughput()
600
- async def oltp_operations():
601
- async with mssql.connect_async(conn_str, oltp_config) as conn:
602
- # Fast, concurrent transactions
603
- tasks = [
604
- conn.execute_async("SELECT * FROM users WHERE id = $1", [user_id])
605
- for user_id in range(1, 101)
606
- ]
607
- results = await asyncio.gather(*tasks)
608
-
609
- # OLAP (Online Analytical Processing) - Fewer, longer-running queries
610
- olap_config = PoolConfig.low_resource()
611
- async def olap_operations():
612
- async with mssql.connect_async(conn_str, olap_config) as conn:
613
- # Long-running analytical queries
614
- quarterly_report = await conn.execute_async("""
615
- SELECT
616
- DATE_TRUNC('quarter', order_date) as quarter,
617
- SUM(total_amount) as total_revenue,
618
- COUNT(*) as order_count
619
- FROM orders
620
- WHERE order_date >= '2024-01-01'
621
- GROUP BY DATE_TRUNC('quarter', order_date)
622
- ORDER BY quarter
623
- """)
624
- return quarterly_report
625
- ```
626
-
627
- ## API Reference
628
-
629
- ### Common Issues
630
-
631
- 1. **Import Error**: Make sure you've built the extension with `maturin develop`
632
- 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.
633
- 3. **Build Errors**: Ensure you have the Rust toolchain installed
634
- 4. **Build Issues**: Make sure you have the Microsoft Visual C++ Build Tools on Windows
635
-
636
-
637
- ## Contributing
638
-
639
- Contributions are welcome! Please open an issue or submit a pull request for any enhancements or bug fixes.
640
-
641
-
642
- ## License
643
-
644
- This project is licensed under the PolyForm Noncommercial License 1.0.0. See the LICENSE file for details.
645
-
646
- ## Third-Party Attributions
647
-
648
- 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.
649
-
650
- **Note:** Additional third-party libraries and their license information are listed in `licenses/NOTICE.txt`.
651
-
652
- - [Tiberius](https://github.com/prisma/tiberius) (Apache License 2.0)
653
- - [PyO3](https://github.com/PyO3/pyo3) (Apache License 2.0)
654
- - [pyo3-asyncio](https://github.com/PyO3/pyo3-asyncio) (Apache License 2.0)
655
- - [bb8](https://github.com/djc/bb8) (MIT or Apache License 2.0)
656
- - [bb8-tiberius](https://github.com/prisma/tiberius) (Apache License 2.0)
657
- - [tokio](https://github.com/tokio-rs/tokio) (MIT or Apache License 2.0)
658
- - [tokio-util](https://github.com/tokio-rs/tokio) (MIT or Apache License 2.0)
659
- - [futures](https://github.com/rust-lang/futures-rs) (MIT or Apache License 2.0)
660
- - [serde](https://github.com/serde-rs/serde) (MIT or Apache License 2.0)
661
- - [serde_json](https://github.com/serde-rs/json) (MIT or Apache License 2.0)
662
- - [anyhow](https://github.com/dtolnay/anyhow) (MIT or Apache License 2.0)
663
- - [chrono](https://github.com/chronotope/chrono) (MIT or Apache License 2.0)
664
- - [uuid](https://github.com/uuid-rs/uuid) (MIT or Apache License 2.0)
665
- - [tempfile](https://github.com/Stebalien/tempfile) (MIT or Apache License 2.0)
666
- - [pytest](https://github.com/pytest-dev/pytest) (MIT License)
667
- - [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) (MIT License)
668
- - [black](https://github.com/psf/black) (MIT License)
669
- - [ruff](https://github.com/astral-sh/ruff) (MIT License)
670
- - [maturin](https://github.com/PyO3/maturin) (Apache License 2.0 or MIT License)
671
- - [Python](https://www.python.org/) and [asyncio](https://docs.python.org/3/library/asyncio.html) (Python Software Foundation License)
672
-
673
- See the `licenses/NOTICE.txt` file for full attribution and copyright information.
674
- The full text of the Apache License 2.0 is provided in the `licenses/APACHE_LICENSE_2.0.txt` file.
675
- The full text of the MIT License is provided in the `licenses/MIT_LICENSE.txt` file.
676
-
677
- ## Acknowledgments
678
-
679
- - [Tiberius](https://github.com/prisma/tiberius) - Rust SQL Server driver (Apache License 2.0)
680
- - [PyO3](https://github.com/PyO3/pyo3) - Python bindings for Rust (Apache License 2.0)
681
- - [pyo3-asyncio](https://github.com/PyO3/pyo3-asyncio) - Async bridge for PyO3 (Apache License 2.0)
682
- - [pytest](https://github.com/pytest-dev/pytest) - Python testing framework (MIT License)
683
- - [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) - Async test support for pytest (MIT License)
684
- - [black](https://github.com/psf/black) - Python code formatter (MIT License)
685
- - [ruff](https://github.com/astral-sh/ruff) - Python linter (MIT License)
686
- - [Python](https://www.python.org/) and [asyncio](https://docs.python.org/3/library/asyncio.html) - Python standard library (Python Software Foundation License)
687
- - [Maturin](https://github.com/PyO3/maturin) - Build tool for Python extensions in Rust
@@ -1,6 +0,0 @@
1
- fastmssql-0.2.7.dist-info/METADATA,sha256=d_Ungip-AytC0OJ27HiasAjTDCCNoOTfYztUE7H_q3k,25322
2
- fastmssql-0.2.7.dist-info/WHEEL,sha256=gTksDcUm4vEEt-WSZ1CnYcSbBNyUtm2mp9lzlf3Yd0w,96
3
- fastmssql-0.2.7.dist-info/licenses/LICENSE,sha256=sHV8b3wGLX_KE9w2JVnp80n-2hQphvBuBfCOlnH4ya0,4904
4
- fastmssql/__init__.py,sha256=9iNqDR_5_4hVjSx20Q1XFDbRbJnVyvB2uq3otWBctnM,29702
5
- fastmssql/fastmssql.cp310-win_amd64.pyd,sha256=0KU5nsEz5GQ99QXDaVK31pkzMfopZar-r6s0JnauTN4,3638784
6
- fastmssql-0.2.7.dist-info/RECORD,,