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