Skip to content

Instantly share code, notes, and snippets.

@nicoddemus
Last active March 26, 2019 16:10
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 nicoddemus/c65c27ad60bc28376bc27ccec165c4c0 to your computer and use it in GitHub Desktop.
Save nicoddemus/c65c27ad60bc28376bc27ccec165c4c0 to your computer and use it in GitHub Desktop.
Quick example of using class-decorators to declare compound columns
from sqlalchemy import create_engine
from sqlalchemy import Column, Float, Integer, String
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:///:memory:', echo=True)
Base = declarative_base()
class ScalarField:
pass
def make_scalars(class_):
for attr_name in dir(class_):
attr_value = getattr(class_, attr_name)
if isinstance(attr_value, ScalarField):
setattr(class_, f'{attr_name}_unit', Column(String))
setattr(class_, f'{attr_name}_value', Column(Float))
return class_
@make_scalars
class Fluid(Base):
__tablename__ = 'fluid'
id = Column(Integer, primary_key=True)
density = ScalarField()
def __repr__(self):
return f"<Fluid(density_value={self.density_value}, density_unit='{self.density_unit}')>"
Base.metadata.create_all(engine)
f = Fluid(density_value=1000.0, density_unit='kg/m3')
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
session.add(f)
print(session.query(Fluid).first())
@igortg
Copy link

igortg commented Mar 26, 2019

2019-03-26 13:09:40,806 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
2019-03-26 13:09:40,806 INFO sqlalchemy.engine.base.Engine ()
2019-03-26 13:09:40,806 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
2019-03-26 13:09:40,806 INFO sqlalchemy.engine.base.Engine ()
2019-03-26 13:09:40,807 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("fluid")
2019-03-26 13:09:40,807 INFO sqlalchemy.engine.base.Engine ()
2019-03-26 13:09:40,808 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE fluid (
	id INTEGER NOT NULL, 
	density_unit VARCHAR, 
	density_value FLOAT, 
	PRIMARY KEY (id)
)


2019-03-26 13:09:40,808 INFO sqlalchemy.engine.base.Engine ()
2019-03-26 13:09:40,808 INFO sqlalchemy.engine.base.Engine COMMIT
2019-03-26 13:09:40,809 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2019-03-26 13:09:40,810 INFO sqlalchemy.engine.base.Engine INSERT INTO fluid (density_unit, density_value) VALUES (?, ?)
2019-03-26 13:09:40,810 INFO sqlalchemy.engine.base.Engine ('kg/m3', 1000.0)
2019-03-26 13:09:40,811 INFO sqlalchemy.engine.base.Engine SELECT fluid.id AS fluid_id, fluid.density_unit AS fluid_density_unit, fluid.density_value AS fluid_density_value 
FROM fluid
 LIMIT ? OFFSET ?
2019-03-26 13:09:40,811 INFO sqlalchemy.engine.base.Engine (1, 0)
<Fluid(density_value=1000.0, density_unit='kg/m3')>
                                                                                                                                                                                                                   

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment