我做了一个小应用程序,它使用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://…
做到了,谢谢(