opencdms-dev / pyopencdms-old

⭐🐍 pyopencdms aims to build a common Python API on top of multiple Climate Data Management Systems (CDMS) that use different underlying database engines
MIT License
4 stars 6 forks source link

Create MIDAS SQLAlchemy ORM models #7

Open isedwards opened 3 years ago

isedwards commented 3 years ago

Create SQLAlchemy 2.0-style ORM models for: MIDAS - requires opencdms-test-data#2 (Oracle Express)

faysal-ishtiaq commented 2 years ago

@isedwards

I have tried to generate the models using sqlacodegen

I followed these steps:

But it throws

01:51:29 (venv) faysal@pop-os met-office-midas ±|main ✗|→ sqlacodegen oracle+cx_oracle://metadata:metadata@127.0.0.1:1521/?service_name=XE
/home/faysal/PycharmProjects/met-office-midas/venv/lib/python3.8/site-packages/sqlacodegen/main.py:47: SAWarning: Did not recognize type 'SDO_GEOMETRY' of column 'src_geom'
  metadata.reflect(engine, args.schema, not args.noviews, tables)
Traceback (most recent call last):
  File "/home/faysal/PycharmProjects/met-office-midas/venv/bin/sqlacodegen", line 8, in <module>
    sys.exit(main())
  File "/home/faysal/PycharmProjects/met-office-midas/venv/lib/python3.8/site-packages/sqlacodegen/main.py", line 51, in main
    generator = CodeGenerator(metadata, args.noindexes, args.noconstraints, args.nojoined,
  File "/home/faysal/PycharmProjects/met-office-midas/venv/lib/python3.8/site-packages/sqlacodegen/codegen.py", line 424, in __init__
    if isinstance(table.c[colname].type, String):
  File "/home/faysal/PycharmProjects/met-office-midas/venv/lib/python3.8/site-packages/sqlalchemy/sql/base.py", line 1210, in __getitem__
    return self._index[key]
KeyError: '  prime_capability_flag'

Looks like sqlacodegen cannot handle SDO_GEOMETRY

Then I tried this as a test:

from sqlalchemy.engine import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm.session import sessionmaker
from sqlalchemy import Column, Integer

db_engine = create_engine("oracle+cx_oracle://metadata:metadata@127.0.0.1:1521/?service_name=XE")
Session = sessionmaker(autocommit=False, autoflush=False, bind=db_engine)
Base = declarative_base()

class EqptCalibCoeff(Base):
    __tablename__ = "EQPT_CALIB_COEFF"
    CALIB_COEFF_MSRT_ID = Column(Integer, primary_key=True)
    EQPT_TYPE_CALIB_COEFF_ID = Column(Integer)
    EQPT_CALIB_ID = Column(Integer)
    CALIB_COEFF_VAL = Column(Integer)

def test_should_successfully_query_eqpt_calib_coeff():
    session = Session()
    session.query(EqptCalibCoeff).all()
    assert True

It passed.

Should I try writing SQLAlchemy models manually?

isedwards commented 1 year ago

@chinedu117 would you like to pick this up and see if you can create models for the Oracle version of the midas schema?

The earliest issues in this repository, that are now closed, give details of the process, e.g. https://github.com/opencdms/pyopencdms/issues/9