taskiq-postgresql


Nametaskiq-postgresql JSON
Version 0.1.0 PyPI version JSON
download
home_pageNone
SummaryPostgreSQL integration for taskiq
upload_time2025-07-30 12:28:08
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseNone
keywords async asyncpg distributed postgresql psqlpy psycopg3 taskiq tasks
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # TaskIQ PostgreSQL

TaskIQ PostgreSQL is a comprehensive plugin for [TaskIQ](https://taskiq-python.github.io/) that provides PostgreSQL-based broker, result backend, and scheduler source with support for multiple PostgreSQL drivers.

## Features

- **🚀 PostgreSQL Broker**: High-performance message broker using PostgreSQL LISTEN/NOTIFY
- **📦 Result Backend**: Persistent task result storage with configurable retention
- **⏰ Scheduler Source**: Cron-like task scheduling with PostgreSQL persistence
- **🔌 Multiple Drivers**: Support for asyncpg, psycopg3, and psqlpy
- **⚡ Async/Await**: Built for high-performance async operations
- **🛠️ Flexible Configuration**: Customizable table names, field types, and connection options
- **🔄 Multiple Serializers**: Support for different serialization methods (Pickle, JSON, etc.)
- **🔐 Connection Pooling**: Built-in connection pool management for all drivers

## Installation

### Basic Installation

```bash
pip install taskiq-postgresql
```

### With Driver Dependencies

Choose your preferred PostgreSQL driver:

**AsyncPG (Recommended)**
```bash
pip install taskiq-postgresql[asyncpg]
```

**Psycopg3**
```bash
pip install taskiq-postgresql[psycopg]
```

**PSQLPy**
```bash
pip install taskiq-postgresql[psqlpy]
```



### Using Package Managers

**Poetry:**
```bash
poetry add taskiq-postgresql[asyncpg]
```

**UV:**
```bash
uv add taskiq-postgresql[asyncpg]
```

**Rye:**
```bash
rye add taskiq-postgresql[asyncpg]
```

> **Note**: Driver extras are required as PostgreSQL drivers are optional dependencies. Without them, the PostgreSQL drivers won't be available.

## Quick Start

### Basic Task Processing

```python
import asyncio
from taskiq_postgresql import PostgresqlBroker, PostgresqlResultBackend

# Configure the result backend
result_backend = PostgresqlResultBackend(
    dsn="postgresql://postgres:postgres@localhost:5432/taskiq_db",
)

# Configure the broker with result backend
broker = PostgresqlBroker(
    dsn="postgresql://postgres:postgres@localhost:5432/taskiq_db",
).with_result_backend(result_backend)


@broker.task
async def calculate_sum(a: int, b: int) -> int:
    """Calculate the sum of two numbers."""
    await asyncio.sleep(1)  # Simulate some work
    return a + b


async def main():
    # Startup the broker
    await broker.startup()
    
    # Send a task
    task = await calculate_sum.kiq(10, 20)
    
    # Wait for result
    result = await task.wait_result()
    print(f"Result: {result}")  # Result: 30
    
    # Shutdown the broker
    await broker.shutdown()


if __name__ == "__main__":
    asyncio.run(main())
```

### Task Scheduling

```python
from taskiq_postgresql import PostgresqlBroker, PostgresqlSchedulerSource
from taskiq import TaskiqScheduler

# Initialize broker
broker = PostgresqlBroker(
    dsn="postgresql://postgres:postgres@localhost:5432/taskiq_db"
)

# Initialize scheduler source
scheduler_source = PostgresqlSchedulerSource(
    dsn="postgresql://postgres:postgres@localhost:5432/taskiq_db",
    table_name="taskiq_schedules",
    driver="asyncpg"
)

# Create scheduler
scheduler = TaskiqScheduler(
    broker=broker,
    sources=[scheduler_source],
)

@broker.task
async def scheduled_task():
    print("This task runs on schedule!")

# Schedule task to run every minute
async def setup_schedule():
    await scheduler_source.add_schedule(
        schedule_id="task-every-minute",
        task_name="scheduled_task",
        cron="* * * * *",  # Every minute
        args=[],
        kwargs={}
    )
```

## Configuration

### PostgresqlBroker

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `dsn` | `str` | Required | PostgreSQL connection string |
| `queue_name` | `str` | `"taskiq_queue"` | Name of the queue table |
| `field_for_task_id` | `Literal["VarChar", "Text", "Uuid"]` | `"Uuid"` | Field type for task IDs |
| `driver` | `Literal["asyncpg", "psycopg", "psqlpy"]` | `"asyncpg"` | Database driver |
| `**connect_kwargs` | `Any` | - | Additional driver-specific connection parameters |

### PostgresqlResultBackend

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `dsn` | `str` | Required | PostgreSQL connection string |
| `keep_results` | `bool` | `True` | Whether to keep results after reading |
| `table_name` | `str` | `"taskiq_results"` | Name of the results table |
| `field_for_task_id` | `Literal["VarChar", "Text", "Uuid"]` | `"Uuid"` | Field type for task IDs |
| `serializer` | `BaseSerializer` | `PickleSerializer()` | Serializer instance |
| `driver` | `Literal["asyncpg", "psycopg", "psqlpy"]` | `"asyncpg"` | Database driver |
| `**connect_kwargs` | `Any` | - | Additional driver-specific connection parameters |

### PostgresqlSchedulerSource

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `dsn` | `str` | Required | PostgreSQL connection string |
| `table_name` | `str` | `"taskiq_schedules"` | Name of the schedules table |
| `driver` | `Literal["asyncpg", "psycopg", "psqlpy"]` | `"asyncpg"` | Database driver |
| `startup_schedule` | `dict` | `None` | Schedule definitions to create on startup |
| `**connect_kwargs` | `Any` | - | Additional driver-specific connection parameters |

## Database Drivers

### AsyncPG (Recommended)
- **Performance**: Fastest PostgreSQL driver for Python
- **Features**: Full asyncio support, prepared statements, connection pooling
- **Use case**: High-performance applications

### Psycopg3
- **Performance**: Good performance with extensive features
- **Features**: Full PostgreSQL feature support, mature ecosystem
- **Use case**: Feature-rich applications needing advanced PostgreSQL features

### PSQLPy
- **Performance**: Rust-based driver with excellent performance
- **Features**: Modern async implementation
- **Use case**: Applications prioritizing performance and modern architecture



## Advanced Configuration

### Custom Serializer

```python
from taskiq.serializers import JSONSerializer

result_backend = PostgresqlResultBackend(
    dsn="postgresql://postgres:postgres@localhost:5432/taskiq_db",
    serializer=JSONSerializer(),
)
```

### Custom Table Names and Field Types

```python
broker = PostgresqlBroker(
    dsn="postgresql://postgres:postgres@localhost:5432/taskiq_db",
    queue_name="my_custom_queue",
    field_for_task_id="Text",  # Use TEXT instead of UUID
)

result_backend = PostgresqlResultBackend(
    dsn="postgresql://postgres:postgres@localhost:5432/taskiq_db",
    table_name="my_custom_results",
    field_for_task_id="VarChar",  # Use VARCHAR instead of UUID
)
```

### Connection Pool Configuration

```python
# AsyncPG
broker = PostgresqlBroker(
    dsn="postgresql://postgres:postgres@localhost:5432/taskiq_db",
    driver="asyncpg",
    min_size=5,
    max_size=20,
    max_inactive_connection_lifetime=300,
)

# Psycopg3
broker = PostgresqlBroker(
    dsn="postgresql://postgres:postgres@localhost:5432/taskiq_db",
    driver="psycopg",
    min_size=5,
    max_size=20,
    max_lifetime=3600,
)
```

### Using Environment Variables

```python
import os

# From environment
dsn = os.getenv("DATABASE_URL", "postgresql://localhost/taskiq")

# With SSL
dsn = "postgresql://user:pass@localhost:5432/db?sslmode=require"

broker = PostgresqlBroker(dsn=dsn)
```

## Database Schema

The library automatically creates the necessary tables:

### Queue Table (default: `taskiq_queue`)
```sql
CREATE TABLE taskiq_queue (
    id SERIAL PRIMARY KEY,
    task_id UUID NOT NULL,
    task_name VARCHAR NOT NULL,
    message BYTEA NOT NULL,
    labels JSONB,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
```

### Results Table (default: `taskiq_results`)
```sql
CREATE TABLE taskiq_results (
    task_id UUID PRIMARY KEY,
    result BYTEA,
    is_err BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
```

### Schedules Table (default: `taskiq_schedules`)
```sql
CREATE TABLE taskiq_schedules (
    id UUID PRIMARY KEY,
    task_name VARCHAR(100) NOT NULL,
    schedule JSONB NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
```

## Performance Tips

1. **Choose the Right Driver**: AsyncPG typically offers the best performance
2. **Connection Pooling**: Configure appropriate pool sizes for your workload
3. **Field Types**: Use UUID for high-performance task IDs, TEXT for debugging
4. **Indexes**: Consider adding indexes on frequently queried columns
5. **Connection Reuse**: Keep broker connections alive during application lifetime

## Troubleshooting

### Common Issues

**Connection Errors**
```python
# Ensure your connection string is correct
dsn = "postgresql://username:password@host:port/database"

# Check PostgreSQL is running and accessible
import asyncpg
conn = await asyncpg.connect(dsn)
await conn.close()
```

**Table Creation Issues**
```python
# Ensure user has CREATE TABLE permissions
# Or manually create tables using provided schemas
```

**Driver Import Errors**
```bash
# Install the appropriate driver extra
pip install taskiq-postgresql[asyncpg]
```

## Requirements

- **Python**: 3.9+
- **TaskIQ**: 0.11.7+
- **PostgreSQL**: 10+

### Driver Dependencies

| Driver | Version | Extra |
|--------|---------|-------|
| AsyncPG | 0.30.0+ | `[asyncpg]` |
| Psycopg3 | 3.2.9+ | `[psycopg]` |
| PSQLPy | 0.11.3+ | `[psqlpy]` |

## Development

This project uses modern Python development tools:

- **[UV](https://github.com/astral-sh/uv)**: Fast Python package installer and resolver
- **[Ruff](https://github.com/astral-sh/ruff)**: Extremely fast Python linter and formatter
- **[Pytest](https://pytest.org/)**: Testing framework

### Setup Development Environment

```bash
# Clone the repository
git clone https://github.com/z22092/taskiq-postgresql.git
cd taskiq-postgresql

# Install dependencies with UV
uv sync

# Install with all driver extras
uv sync --extra asyncpg --extra psycopg --extra psqlpy

# Run tests
uv run pytest

# Format and lint
uv run ruff format
uv run ruff check
```

## Contributing

Contributions are welcome! Please:

1. Fork the repository
2. Create a feature branch
3. Add tests for new functionality
4. Ensure all tests pass
5. Submit a pull request

## License

This project is licensed under the MIT License. See the LICENSE file for details.

## Links

- **[TaskIQ Documentation](https://taskiq-python.github.io/)** - Main TaskIQ framework
- **[AsyncPG Documentation](https://magicstack.github.io/asyncpg/)** - AsyncPG driver docs
- **[Psycopg Documentation](https://www.psycopg.org/psycopg3/)** - Psycopg3 driver docs  
- **[PostgreSQL Documentation](https://www.postgresql.org/docs/)** - PostgreSQL database docs
- **[GitHub Repository](https://github.com/z22092/taskiq-postgresql)** - Source code and issues

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "taskiq-postgresql",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "async, asyncpg, distributed, postgresql, psqlpy, psycopg3, taskiq, tasks",
    "author": null,
    "author_email": "jeffersonsilva-mb <jefferson.silva@mb.com.br>, Jefferson Venceslau <jeff.venceslau@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/5c/6a/c636c33b97c438c6fc4c7073b73a50e9bee9c50dd91ca1e229cec5d10fa7/taskiq_postgresql-0.1.0.tar.gz",
    "platform": null,
    "description": "# TaskIQ PostgreSQL\n\nTaskIQ PostgreSQL is a comprehensive plugin for [TaskIQ](https://taskiq-python.github.io/) that provides PostgreSQL-based broker, result backend, and scheduler source with support for multiple PostgreSQL drivers.\n\n## Features\n\n- **\ud83d\ude80 PostgreSQL Broker**: High-performance message broker using PostgreSQL LISTEN/NOTIFY\n- **\ud83d\udce6 Result Backend**: Persistent task result storage with configurable retention\n- **\u23f0 Scheduler Source**: Cron-like task scheduling with PostgreSQL persistence\n- **\ud83d\udd0c Multiple Drivers**: Support for asyncpg, psycopg3, and psqlpy\n- **\u26a1 Async/Await**: Built for high-performance async operations\n- **\ud83d\udee0\ufe0f Flexible Configuration**: Customizable table names, field types, and connection options\n- **\ud83d\udd04 Multiple Serializers**: Support for different serialization methods (Pickle, JSON, etc.)\n- **\ud83d\udd10 Connection Pooling**: Built-in connection pool management for all drivers\n\n## Installation\n\n### Basic Installation\n\n```bash\npip install taskiq-postgresql\n```\n\n### With Driver Dependencies\n\nChoose your preferred PostgreSQL driver:\n\n**AsyncPG (Recommended)**\n```bash\npip install taskiq-postgresql[asyncpg]\n```\n\n**Psycopg3**\n```bash\npip install taskiq-postgresql[psycopg]\n```\n\n**PSQLPy**\n```bash\npip install taskiq-postgresql[psqlpy]\n```\n\n\n\n### Using Package Managers\n\n**Poetry:**\n```bash\npoetry add taskiq-postgresql[asyncpg]\n```\n\n**UV:**\n```bash\nuv add taskiq-postgresql[asyncpg]\n```\n\n**Rye:**\n```bash\nrye add taskiq-postgresql[asyncpg]\n```\n\n> **Note**: Driver extras are required as PostgreSQL drivers are optional dependencies. Without them, the PostgreSQL drivers won't be available.\n\n## Quick Start\n\n### Basic Task Processing\n\n```python\nimport asyncio\nfrom taskiq_postgresql import PostgresqlBroker, PostgresqlResultBackend\n\n# Configure the result backend\nresult_backend = PostgresqlResultBackend(\n    dsn=\"postgresql://postgres:postgres@localhost:5432/taskiq_db\",\n)\n\n# Configure the broker with result backend\nbroker = PostgresqlBroker(\n    dsn=\"postgresql://postgres:postgres@localhost:5432/taskiq_db\",\n).with_result_backend(result_backend)\n\n\n@broker.task\nasync def calculate_sum(a: int, b: int) -> int:\n    \"\"\"Calculate the sum of two numbers.\"\"\"\n    await asyncio.sleep(1)  # Simulate some work\n    return a + b\n\n\nasync def main():\n    # Startup the broker\n    await broker.startup()\n    \n    # Send a task\n    task = await calculate_sum.kiq(10, 20)\n    \n    # Wait for result\n    result = await task.wait_result()\n    print(f\"Result: {result}\")  # Result: 30\n    \n    # Shutdown the broker\n    await broker.shutdown()\n\n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n```\n\n### Task Scheduling\n\n```python\nfrom taskiq_postgresql import PostgresqlBroker, PostgresqlSchedulerSource\nfrom taskiq import TaskiqScheduler\n\n# Initialize broker\nbroker = PostgresqlBroker(\n    dsn=\"postgresql://postgres:postgres@localhost:5432/taskiq_db\"\n)\n\n# Initialize scheduler source\nscheduler_source = PostgresqlSchedulerSource(\n    dsn=\"postgresql://postgres:postgres@localhost:5432/taskiq_db\",\n    table_name=\"taskiq_schedules\",\n    driver=\"asyncpg\"\n)\n\n# Create scheduler\nscheduler = TaskiqScheduler(\n    broker=broker,\n    sources=[scheduler_source],\n)\n\n@broker.task\nasync def scheduled_task():\n    print(\"This task runs on schedule!\")\n\n# Schedule task to run every minute\nasync def setup_schedule():\n    await scheduler_source.add_schedule(\n        schedule_id=\"task-every-minute\",\n        task_name=\"scheduled_task\",\n        cron=\"* * * * *\",  # Every minute\n        args=[],\n        kwargs={}\n    )\n```\n\n## Configuration\n\n### PostgresqlBroker\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `dsn` | `str` | Required | PostgreSQL connection string |\n| `queue_name` | `str` | `\"taskiq_queue\"` | Name of the queue table |\n| `field_for_task_id` | `Literal[\"VarChar\", \"Text\", \"Uuid\"]` | `\"Uuid\"` | Field type for task IDs |\n| `driver` | `Literal[\"asyncpg\", \"psycopg\", \"psqlpy\"]` | `\"asyncpg\"` | Database driver |\n| `**connect_kwargs` | `Any` | - | Additional driver-specific connection parameters |\n\n### PostgresqlResultBackend\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `dsn` | `str` | Required | PostgreSQL connection string |\n| `keep_results` | `bool` | `True` | Whether to keep results after reading |\n| `table_name` | `str` | `\"taskiq_results\"` | Name of the results table |\n| `field_for_task_id` | `Literal[\"VarChar\", \"Text\", \"Uuid\"]` | `\"Uuid\"` | Field type for task IDs |\n| `serializer` | `BaseSerializer` | `PickleSerializer()` | Serializer instance |\n| `driver` | `Literal[\"asyncpg\", \"psycopg\", \"psqlpy\"]` | `\"asyncpg\"` | Database driver |\n| `**connect_kwargs` | `Any` | - | Additional driver-specific connection parameters |\n\n### PostgresqlSchedulerSource\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `dsn` | `str` | Required | PostgreSQL connection string |\n| `table_name` | `str` | `\"taskiq_schedules\"` | Name of the schedules table |\n| `driver` | `Literal[\"asyncpg\", \"psycopg\", \"psqlpy\"]` | `\"asyncpg\"` | Database driver |\n| `startup_schedule` | `dict` | `None` | Schedule definitions to create on startup |\n| `**connect_kwargs` | `Any` | - | Additional driver-specific connection parameters |\n\n## Database Drivers\n\n### AsyncPG (Recommended)\n- **Performance**: Fastest PostgreSQL driver for Python\n- **Features**: Full asyncio support, prepared statements, connection pooling\n- **Use case**: High-performance applications\n\n### Psycopg3\n- **Performance**: Good performance with extensive features\n- **Features**: Full PostgreSQL feature support, mature ecosystem\n- **Use case**: Feature-rich applications needing advanced PostgreSQL features\n\n### PSQLPy\n- **Performance**: Rust-based driver with excellent performance\n- **Features**: Modern async implementation\n- **Use case**: Applications prioritizing performance and modern architecture\n\n\n\n## Advanced Configuration\n\n### Custom Serializer\n\n```python\nfrom taskiq.serializers import JSONSerializer\n\nresult_backend = PostgresqlResultBackend(\n    dsn=\"postgresql://postgres:postgres@localhost:5432/taskiq_db\",\n    serializer=JSONSerializer(),\n)\n```\n\n### Custom Table Names and Field Types\n\n```python\nbroker = PostgresqlBroker(\n    dsn=\"postgresql://postgres:postgres@localhost:5432/taskiq_db\",\n    queue_name=\"my_custom_queue\",\n    field_for_task_id=\"Text\",  # Use TEXT instead of UUID\n)\n\nresult_backend = PostgresqlResultBackend(\n    dsn=\"postgresql://postgres:postgres@localhost:5432/taskiq_db\",\n    table_name=\"my_custom_results\",\n    field_for_task_id=\"VarChar\",  # Use VARCHAR instead of UUID\n)\n```\n\n### Connection Pool Configuration\n\n```python\n# AsyncPG\nbroker = PostgresqlBroker(\n    dsn=\"postgresql://postgres:postgres@localhost:5432/taskiq_db\",\n    driver=\"asyncpg\",\n    min_size=5,\n    max_size=20,\n    max_inactive_connection_lifetime=300,\n)\n\n# Psycopg3\nbroker = PostgresqlBroker(\n    dsn=\"postgresql://postgres:postgres@localhost:5432/taskiq_db\",\n    driver=\"psycopg\",\n    min_size=5,\n    max_size=20,\n    max_lifetime=3600,\n)\n```\n\n### Using Environment Variables\n\n```python\nimport os\n\n# From environment\ndsn = os.getenv(\"DATABASE_URL\", \"postgresql://localhost/taskiq\")\n\n# With SSL\ndsn = \"postgresql://user:pass@localhost:5432/db?sslmode=require\"\n\nbroker = PostgresqlBroker(dsn=dsn)\n```\n\n## Database Schema\n\nThe library automatically creates the necessary tables:\n\n### Queue Table (default: `taskiq_queue`)\n```sql\nCREATE TABLE taskiq_queue (\n    id SERIAL PRIMARY KEY,\n    task_id UUID NOT NULL,\n    task_name VARCHAR NOT NULL,\n    message BYTEA NOT NULL,\n    labels JSONB,\n    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()\n);\n```\n\n### Results Table (default: `taskiq_results`)\n```sql\nCREATE TABLE taskiq_results (\n    task_id UUID PRIMARY KEY,\n    result BYTEA,\n    is_err BOOLEAN DEFAULT FALSE,\n    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()\n);\n```\n\n### Schedules Table (default: `taskiq_schedules`)\n```sql\nCREATE TABLE taskiq_schedules (\n    id UUID PRIMARY KEY,\n    task_name VARCHAR(100) NOT NULL,\n    schedule JSONB NOT NULL,\n    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()\n);\n```\n\n## Performance Tips\n\n1. **Choose the Right Driver**: AsyncPG typically offers the best performance\n2. **Connection Pooling**: Configure appropriate pool sizes for your workload\n3. **Field Types**: Use UUID for high-performance task IDs, TEXT for debugging\n4. **Indexes**: Consider adding indexes on frequently queried columns\n5. **Connection Reuse**: Keep broker connections alive during application lifetime\n\n## Troubleshooting\n\n### Common Issues\n\n**Connection Errors**\n```python\n# Ensure your connection string is correct\ndsn = \"postgresql://username:password@host:port/database\"\n\n# Check PostgreSQL is running and accessible\nimport asyncpg\nconn = await asyncpg.connect(dsn)\nawait conn.close()\n```\n\n**Table Creation Issues**\n```python\n# Ensure user has CREATE TABLE permissions\n# Or manually create tables using provided schemas\n```\n\n**Driver Import Errors**\n```bash\n# Install the appropriate driver extra\npip install taskiq-postgresql[asyncpg]\n```\n\n## Requirements\n\n- **Python**: 3.9+\n- **TaskIQ**: 0.11.7+\n- **PostgreSQL**: 10+\n\n### Driver Dependencies\n\n| Driver | Version | Extra |\n|--------|---------|-------|\n| AsyncPG | 0.30.0+ | `[asyncpg]` |\n| Psycopg3 | 3.2.9+ | `[psycopg]` |\n| PSQLPy | 0.11.3+ | `[psqlpy]` |\n\n## Development\n\nThis project uses modern Python development tools:\n\n- **[UV](https://github.com/astral-sh/uv)**: Fast Python package installer and resolver\n- **[Ruff](https://github.com/astral-sh/ruff)**: Extremely fast Python linter and formatter\n- **[Pytest](https://pytest.org/)**: Testing framework\n\n### Setup Development Environment\n\n```bash\n# Clone the repository\ngit clone https://github.com/z22092/taskiq-postgresql.git\ncd taskiq-postgresql\n\n# Install dependencies with UV\nuv sync\n\n# Install with all driver extras\nuv sync --extra asyncpg --extra psycopg --extra psqlpy\n\n# Run tests\nuv run pytest\n\n# Format and lint\nuv run ruff format\nuv run ruff check\n```\n\n## Contributing\n\nContributions are welcome! Please:\n\n1. Fork the repository\n2. Create a feature branch\n3. Add tests for new functionality\n4. Ensure all tests pass\n5. Submit a pull request\n\n## License\n\nThis project is licensed under the MIT License. See the LICENSE file for details.\n\n## Links\n\n- **[TaskIQ Documentation](https://taskiq-python.github.io/)** - Main TaskIQ framework\n- **[AsyncPG Documentation](https://magicstack.github.io/asyncpg/)** - AsyncPG driver docs\n- **[Psycopg Documentation](https://www.psycopg.org/psycopg3/)** - Psycopg3 driver docs  \n- **[PostgreSQL Documentation](https://www.postgresql.org/docs/)** - PostgreSQL database docs\n- **[GitHub Repository](https://github.com/z22092/taskiq-postgresql)** - Source code and issues\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "PostgreSQL integration for taskiq",
    "version": "0.1.0",
    "project_urls": null,
    "split_keywords": [
        "async",
        " asyncpg",
        " distributed",
        " postgresql",
        " psqlpy",
        " psycopg3",
        " taskiq",
        " tasks"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fd00adf1f0ec0277052e7330697eb804ede14454efb020996a602f2378907d43",
                "md5": "5a61275298f55978feed8f0bca41ed40",
                "sha256": "f447d9b9f6091ab39605b4612ce11173635c071e37a013f32ecf3ba2fd242fc3"
            },
            "downloads": -1,
            "filename": "taskiq_postgresql-0.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "5a61275298f55978feed8f0bca41ed40",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 24709,
            "upload_time": "2025-07-30T12:28:07",
            "upload_time_iso_8601": "2025-07-30T12:28:07.212292Z",
            "url": "https://files.pythonhosted.org/packages/fd/00/adf1f0ec0277052e7330697eb804ede14454efb020996a602f2378907d43/taskiq_postgresql-0.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5c6ac636c33b97c438c6fc4c7073b73a50e9bee9c50dd91ca1e229cec5d10fa7",
                "md5": "dc5bb83a4bf9d3ffa1cdf75cb435a14d",
                "sha256": "33f0efd9b6bed7601493af637c86cd677d4af2464709c273d990616221f2f9bd"
            },
            "downloads": -1,
            "filename": "taskiq_postgresql-0.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "dc5bb83a4bf9d3ffa1cdf75cb435a14d",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 124096,
            "upload_time": "2025-07-30T12:28:08",
            "upload_time_iso_8601": "2025-07-30T12:28:08.857139Z",
            "url": "https://files.pythonhosted.org/packages/5c/6a/c636c33b97c438c6fc4c7073b73a50e9bee9c50dd91ca1e229cec5d10fa7/taskiq_postgresql-0.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-30 12:28:08",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "taskiq-postgresql"
}
        
Elapsed time: 1.36821s