Skip to content

Instantly share code, notes, and snippets.

@wonderbeyond
Last active May 24, 2023 05:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wonderbeyond/cccd0c0c166f3f8532deae5f1d74420c to your computer and use it in GitHub Desktop.
Save wonderbeyond/cccd0c0c166f3f8532deae5f1d74420c to your computer and use it in GitHub Desktop.
SQLAlchemy - Good practice to make life easy

Make a Custom JSON Encoder/Serializer

A example of custom json serializer:

# file: json.py
def custom_json_encoder(o):
    if isinstance(o, pydantic.BaseModel):
        res = o.dict()
        return res['__root__'] if '__root__' in res else res
    return pydantic_encoder(o)


def dumps(obj, **kwargs):
    return json.dumps(obj, default=custom_json_encoder, **kwargs)

Bind it to the db engine:

create_async_engine(self.url, json_serializer=json.dumps, **engine_options)

Let Alembic get sqlalchemy.url from main App Config

  1. Disable sqlalchemy.url setting in alembic.ini.

  2. In alembic/env.py, something like:

    from myproj.conf import settings
    import myproj.models
    
    dbc = settings.db
    
    config = context.config
    config.set_main_option(
        'sqlalchemy.url',
        f'postgresql+psycopg2://{dbc.user}:{dbc.password}@{dbc.host}:{dbc.port}/{dbc.database}'
    )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment