Skip to content

Native SQLAlchemy queries

You can asynchronously execute native SQLAlchemy queries using the sqlactive.conn.execute function. It uses the AsyncSession of the ActiveRecordBaseModel class and return a buffered sqlalchemy.engine.Result object.

Usage

from sqlalchemy import select, func
from sqlactive import execute

query = select(User.age, func.count(User.id)).group_by(User.age)
result = await execute(query)

The statement, params and kwargs arguments of this function are the same as the arguments of the execute method of the sqlalchemy.ext.asyncio.AsyncSession class.

If your base model is not ActiveRecordBaseModel you must pass your base model class to the base_model argument of the execute method:

from sqlalchemy import select, func
from sqlactive import ActiveRecordBaseModel, execute

# Note that it does not matter if your base model
# inherits from `ActiveRecordBaseModel`, you still
# need to pass it to this method
class BaseModel(ActiveRecordBaseModel):
    __abstract__ = True

class User(BaseModel):
    __tablename__ = 'users'
    # ...

query = select(User.age, func.count(User.id)).group_by(User.age)
result = await execute(query, BaseModel)  # or execute(query, User)
Warning

Your base model must have a session in order to use this method. Otherwise, it will raise an NoSessionError exception. If you are not using the DBConnection class to initialize your base model, you can call its set_session method to set the session.