异步 SQL无法创建引擎



我做了一个小应用程序,它使用SQLAlchemy来处理与postgresql数据库的连接。现在我想用asincio重写它。出于某种原因,当我运行它时,我会得到以下错误:

Traceback (most recent call last):
File "D:Spacediscord_count_botbotbotmain.py", line 12, in <module>
dbConnection.init_connection(
File "D:Spacediscord_count_botbotbotdb_hanler.py", line 78, in init_connection
engine = create_async_engine(connection_string, future=True, echo=True)
File "D:Spacediscord_count_botbot_envlibsite-packagessqlalchemyextasyncioengine.py", line 40, in create_async_engine
sync_engine = _create_engine(*arg, **kw)
File "<string>", line 2, in create_engine
File "D:Spacediscord_count_botbot_envlibsite-packagessqlalchemyutildeprecations.py", line 298, in warned
return fn(*args, **kwargs)
File "D:Spacediscord_count_botbot_envlibsite-packagessqlalchemyenginecreate.py", line 560, in create_engine
dbapi = dialect_cls.dbapi(**dbapi_args)
File "D:Spacediscord_count_botbot_envlibsite-packagessqlalchemydialectspostgresqlpsycopg2.py", line 782, in dbapi
import psycopg2
ModuleNotFoundError: No module named 'psycopg2'

如果安装了psycopg2,我会得到

Traceback (most recent call last):
File "D:Spacediscord_count_botbotbotmain.py", line 12, in <module>
dbConnection.init_connection(
File "D:Spacediscord_count_botbotbotdb_hanler.py", line 78, in init_connection
engine = create_async_engine(connection_string, future=True, echo=True)
File "D:Spacediscord_count_botbot_envlibsite-packagessqlalchemyextasyncioengine.py", line 41, in create_async_engine
return AsyncEngine(sync_engine)
File "D:Spacediscord_count_botbot_envlibsite-packagessqlalchemyextasyncioengine.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()

正如Gord Thompson所说,我需要在连接字符串中更加具体,postgresql+asyncpg://…做到了,谢谢(

最新更新