SQLAlchemy における snake case と camel case

Java では、テーブルカラム名snake case に対して
マッピングする Java Object を camel case とする約束に
拘ることが多いが、Python で拘っているのを見かけない。
それでも、テーブルカラム:snake case ・・・ Pythonの オブジェクト:camel case に
拘る場合は、SQLAlchemy Column 宣言
snake case ⇒ camel case をサポートするようにする。

サンプルのテーブル定義DDLPostgreSQL)

CREATE TABLE itemwork (
	id int8 GENERATED ALWAYS AS IDENTITY( INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1 NO CYCLE) NOT NULL,
	user_name varchar(120) NOT NULL,
	v_point int4 DEFAULT 0 NOT NULL,
	create_date date DEFAULT CURRENT_DATE NULL,
	create_time timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL,
	CONSTRAINT itemwork_pkey PRIMARY KEY (id)
);

Python SQLAlchemy で、対応するエンティティクラスの定義で、
以下のように、Column 宣言で name = ’テーブルのカラム名(snake case)’ を書く

import sqlalchemy as db
from sqlalchemy.orm import declarative_base
from sqlalchemy import inspect
from sqlalchemy.ext.hybrid import hybrid_property
from datetime import date, datetime
import json

class Twork(declarative_base()):
    __tablename__ = 'itemwork'
    id = db.Column(db.BigInteger, nullable=False, primary_key=True)
    userName = db.Column(db.String(120), name='user_name', nullable=False)
    vPoint = db.Column(db.INT, name='v_point', nullable=False, default=0)
    createDate = db.Column(db.DATE, name='create_date')
    createTime = db.Column(db.TIMESTAMP, name='create_time', nullable=False)

    def __init__(self,  userName:str, vPoint:int, createDate:date, createTime:datetime):
        self.userName = userName
        self.vPoint = vPoint
        self.createDate = createDate
        self.createTime = createTime

    def to_dict(self) -> {}:
        dict_ = {}
        for key in self.__mapper__.c.keys():
            if not key.startswith('_'):
                dict_[key] = getattr(self, key)
        for key, prop in inspect(self.__class__).all_orm_descriptors.items():
            if isinstance(prop, hybrid_property):
                dict_[key] = getattr(self, key)
        return dict_

    def to_json(self) -> str:
        return json.dumps(self.to_dict(), default=lambda o: o.strftime('%Y-%m-%d %H:%M:%S')
                            if isinstance(o, datetime)
                            else o.strftime('%Y-%m-%d')
                            if isinstance(o, date) else o.__dict__, indent=2)