簡體   English   中英

異步 SQLAlchemy 無法創建引擎

[英]async SQLAlchemy can't create engine

我制作了一個小應用程序,它使用SQLAlchemy來處理與 postgresql 數據庫的連接。 現在我想用 asincio 重寫它。 出於某種原因,當我運行它時,出現以下錯誤:

Traceback (most recent call last):
  File "D:\Space\discord_count_bot\bot\bot\main.py", line 12, in <module>
    dbConnection.init_connection(
  File "D:\Space\discord_count_bot\bot\bot\db_hanler.py", line 78, in init_connection
    engine = create_async_engine(connection_string, future=True, echo=True)
  File "D:\Space\discord_count_bot\bot_env\lib\site-packages\sqlalchemy\ext\asyncio\engine.py", line 40, in create_async_engine
    sync_engine = _create_engine(*arg, **kw)
  File "<string>", line 2, in create_engine
  File "D:\Space\discord_count_bot\bot_env\lib\site-packages\sqlalchemy\util\deprecations.py", line 298, in warned
    return fn(*args, **kwargs)
  File "D:\Space\discord_count_bot\bot_env\lib\site-packages\sqlalchemy\engine\create.py", line 560, in create_engine
    dbapi = dialect_cls.dbapi(**dbapi_args)
  File "D:\Space\discord_count_bot\bot_env\lib\site-packages\sqlalchemy\dialects\postgresql\psycopg2.py", line 782, in dbapi
    import psycopg2
ModuleNotFoundError: No module named 'psycopg2'

如果安裝了psycopg2 ,我會得到

Traceback (most recent call last):
  File "D:\Space\discord_count_bot\bot\bot\main.py", line 12, in <module>
    dbConnection.init_connection(
  File "D:\Space\discord_count_bot\bot\bot\db_hanler.py", line 78, in init_connection
    engine = create_async_engine(connection_string, future=True, echo=True)
  File "D:\Space\discord_count_bot\bot_env\lib\site-packages\sqlalchemy\ext\asyncio\engine.py", line 41, in create_async_engine
    return AsyncEngine(sync_engine)
  File "D:\Space\discord_count_bot\bot_env\lib\site-packages\sqlalchemy\ext\asyncio\engine.py", line 598, in __init__
    raise exc.InvalidRequestError(
sqlalchemy.exc.InvalidRequestError: The asyncio extension requires an async driver to be used. The loaded 'psycopg2' is not async. 

我安裝了asyncpg ,我想,我需要特別告訴SQLAlchemy使用它。 或者,我的代碼中有一些東西讓SQLAlchemy認為它應該使用psycopg2 ......我找不到任何關於它的東西,在我遇到的每個教程中,一切似乎都很好。


from datetime import datetime, timedelta
import logging

from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import select, and_
from sqlalchemy import Column, Integer, String, DateTime, Boolean

logger = logging.getLogger('discord')
Base = declarative_base()


class TaskModel(Base):
    """Counting task model for database."""

    __tablename__ = 'tasks'

    id = Column(Integer, primary_key=True)
    author = Column(String(200))
    channel_id = Column(Integer)
    is_dm = Column(Boolean)
    start_time = Column(DateTime)
    end_time = Column(DateTime)
    count = Column(Integer)
    canceled = Column(Boolean)


class DBConnection:
    """Class handles all the db operations."""

    def __init__(self):
        """Create new uninitialized handler."""
        self._session: AsyncSession = None

    def init_connection(self, user, password, host, port, db):
        """Connect to actual database."""
        connection_string = "postgresql://{}:{}@{}:{}/{}".format(
            user, password, host, port, db
        )
        engine = create_async_engine(connection_string, future=True, echo=True)
        self._session = sessionmaker(engine, expire_on_commit=False, class_=AsyncSession)

    async def add_task(self, author, channel_id, count, is_dm):
        """Add new task to db."""
        now = datetime.utcnow()
        task = TaskModel(
            author=author,
            channel_id=channel_id,
            is_dm=is_dm,
            start_time=now,
            end_time=now + timedelta(seconds=count),
            count=count,
            canceled=False
        )
        self._session.add(task)
        await self._session.commit()
        logger.info(f"task added to db: {task}")
        return task

    async def get_active_tasks(self):
        """Get all active tasks."""
        now = datetime.utcnow()
        async with self._session() as session:
            query = select(TaskModel).where(and_(
                    TaskModel.end_time > now,
                    TaskModel.canceled == False
            ))
            result = await session.execute(query)
            return result.fetchall()

dbConnection = DBConnection()

正如戈德湯普森所說,我需要在我的連接字符串中更具體, postgresql+asyncpg://…成功了,謝謝)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM