diff --git a/toardb/timeseries/crud.py b/toardb/timeseries/crud.py index f8dc8369fc2f2316621df35d02444bbfcf695d31..08131dd9aabeecedeb4b5063c5ad858b6b9e7a87 100644 --- a/toardb/timeseries/crud.py +++ b/toardb/timeseries/crud.py @@ -4,10 +4,11 @@ Create, Read, Update, Delete functionality """ +from sqlalchemy import insert from sqlalchemy.orm import Session from fastapi.responses import JSONResponse from . import models -from .models import RS_enum, RC_enum +from .models import RS_enum, RC_enum, timeseries_timeseries_roles_table from .schemas import TimeseriesCreate @@ -24,11 +25,6 @@ def get_all_timeseries(db: Session, skip : int = 0, limit: int = None): for db_object in db_objects: # there is a mismatch with additional_metadata db_object.additional_metadata = str(db_object.additional_metadata) - # add roles (model does not have them!) - # do I need a second model?! (not related to the real database?!) - roles = get_role_ids_of_timeseries(db, int(db_object.id)) - print("====================roles ==================", db_object.id, roles) - # now return for schema TimeseriesCore (model.Timeseries has no roles!) return db_objects @@ -84,7 +80,7 @@ def create_timeseries(db: Session, timeseries: TimeseriesCreate): db.refresh(db_timeseries) # get timeseries_id timeseries_id = db_timeseries.id - # store roles and update associaton table + # store roles (and update associaton table?!) for r in roles_data: # try which format is used try: @@ -100,11 +96,7 @@ def create_timeseries(db: Session, timeseries: TimeseriesCreate): db.commit() db.refresh(db_role) role_id = db_role.id - r['id'] = role_id - # now into associaton table! - db_assoc = models.TimeseriesTimeseriesRoles(timeseries_id=timeseries_id, role_id=role_id) - db.add(db_assoc) + # now into associaton table! --> This should be done automatically?! + db.execute(insert(timeseries_timeseries_roles_table).values(timeseries_id=timeseries_id, role_id=role_id)) db.commit() - db.refresh(db_assoc) - setattr(db_timeseries,'roles',roles_data) return db_timeseries diff --git a/toardb/timeseries/models.py b/toardb/timeseries/models.py index 400dbd8a02c85a70313169d8fd8c891a12ad7170..956351353f397c20677b9ef995975a72eee2abb7 100644 --- a/toardb/timeseries/models.py +++ b/toardb/timeseries/models.py @@ -4,7 +4,7 @@ from sqlalchemy.ext.declarative import declarative_base from .models_core import ( Timeseries, TimeseriesRole, - TimeseriesTimeseriesRoles, + timeseries_timeseries_roles_table, Base as TimeseriesBase) from .models_annotation import ( TimeseriesAnnotation, @@ -28,72 +28,6 @@ for declarative_base in [TimeseriesBase, TimeseriesAnnotationBase, TimeseriesPro Base.metadata = metadata -""" -Table "public.timeseries_timeseries_annotations" -+---------------+---------+-----------+----------+---------+ -| Column | Type | Collation | Nullable | Default | -+===============+=========+===========+==========+=========+ -| timeseries_id | integer | | not null | | -+---------------+---------+-----------+----------+---------+ -| annotation_id | integer | | not null | | -+---------------+---------+-----------+----------+---------+ -Indexes: - "timeseries_timeseries_annotations_pkey" PRIMARY KEY, btree (timeseries_id, annotation_id) -Foreign-key constraints: - "timeseries_timeseries_annotations_annotation_id_fkey" FOREIGN KEY (annotation_id) REFERENCES timeseries_annotations(id) - "timeseries_timeseries_annotations_timeseries_id_fkey" FOREIGN KEY (timeseries_id) REFERENCES timeseries(id) -""" -##t_timeseries_timeseries_annotations = Table( -## 'timeseries_timeseries_annotations', metadata, -## Column('timeseries_id', ForeignKey('timeseries.id'), primary_key=True, nullable=False), -## Column('annotation_id', ForeignKey('timeseries_annotations.id'), primary_key=True, nullable=False) -##) - -""" -Table "public.timeseries_timeseries_programmes" -+---------------+---------+-----------+----------+---------+ -| Column | Type | Collation | Nullable | Default | -+===============+=========+===========+==========+=========+ -| timeseries_id | integer | | not null | | -+---------------+---------+-----------+----------+---------+ -| programme_id | integer | | not null | | -+---------------+---------+-----------+----------+---------+ -Indexes: - "timeseries_timeseries_programmes_pkey" PRIMARY KEY, btree (timeseries_id, programme_id) -Foreign-key constraints: - "timeseries_timeseries_programmes_programme_id_fkey" FOREIGN KEY (programme_id) REFERENCES timeseries_programmes(id) - "timeseries_timeseries_programmes_timeseries_id_fkey" FOREIGN KEY (timeseries_id) REFERENCES timeseries(id) -""" - -##t_timeseries_timeseries_programmes = Table( -## 'timeseries_timeseries_programmes', metadata, -## Column('timeseries_id', ForeignKey('timeseries.id'), primary_key=True, nullable=False), -## Column('programme_id', ForeignKey('timeseries_programmes.id'), primary_key=True, nullable=False) -##) - -## class TimeseriesTimeseriesRoles(Base): -## """ -## Table "public.timeseries_timeseries_roles" -## +---------------+---------+-----------+----------+---------+ -## | Column | Type | Collation | Nullable | Default | -## +===============+=========+===========+==========+=========+ -## | timeseries_id | integer | | not null | | -## +---------------+---------+-----------+----------+---------+ -## | role_id | integer | | not null | | -## +---------------+---------+-----------+----------+---------+ -## Indexes: -## "timeseries_timeseries_roles_pkey" PRIMARY KEY, btree (timeseries_id, role_id) -## Foreign-key constraints: -## "timeseries_timeseries_roles_role_id_fkey" FOREIGN KEY (role_id) REFERENCES timeseries_roles(id) -## "timeseries_timeseries_roles_timeseries_id_fkey" FOREIGN KEY (timeseries_id) REFERENCES timeseries(id) -## """ - -## __tablename__ = 'timeseries_timeseries_roles' - -## timeseries_id = Column(Integer, ForeignKey(Timeseries.id), primary_key=True, nullable=False) -## role_id = Column(Integer, ForeignKey(TimeseriesRole.id), primary_key=True, nullable=False) - - # controlled vocabulary RS_enum = Table("rs_vocabulary", metadata, diff --git a/toardb/timeseries/models_core.py b/toardb/timeseries/models_core.py index 1ac610f18169e7407d7e2a75202e95ce01ba2d25..cfac0b61713c96a7fbbeff16ef758187cfc567b8 100644 --- a/toardb/timeseries/models_core.py +++ b/toardb/timeseries/models_core.py @@ -20,53 +20,24 @@ metadata = Base.metadata # pytest does not accept strings within ForeignKey, relationship, ... # forward declarations # (because of now commented line with relationship -class TimeseriesRole(Base): - __tablename__ = 'timeseries_roles' - id = Column(Integer, primary_key=True, server_default=text("nextval('timeseries_roles_id_seq'::regclass)")) +#class TimeseriesRole(Base): +# __tablename__ = 'timeseries_roles' +# id = Column(Integer, primary_key=True, server_default=text("nextval('timeseries_roles_id_seq'::regclass)")) -class Timeseries(Base): - __tablename__ = 'timeseries' - id = Column(Integer, primary_key=True, server_default=text("nextval('timeseries_id_seq'::regclass)")) +#class Timeseries(Base): +# __tablename__ = 'timeseries' +# id = Column(Integer, primary_key=True, server_default=text("nextval('timeseries_id_seq'::regclass)")) -##timeseries_timeseries_roles = Table('timeseries_timeseries_roles', Base.metadata, -## Column('timeseries_id', Integer, ForeignKey('public.timeseries.id')), -## Column('role_id', Integer, ForeignKey('public.timeseries_roles.id')) -##) +timeseries_timeseries_roles_table = Table('timeseries_timeseries_roles', Base.metadata, + Column('timeseries_id', Integer, ForeignKey('timeseries.id')), + Column('role_id', Integer, ForeignKey('timeseries_roles.id')) +) #timeseries_timeseries_roles = Table('timeseries_timeseries_roles', Base.metadata, # Column('timeseries_id', Integer, ForeignKey(Timeseries.id)), # Column('role_id', Integer, ForeignKey(TimeseriesRole.id)) #) -class TimeseriesTimeseriesRoles(Base): - """ - Table "public.timeseries_timeseries_roles" - +---------------+---------+-----------+----------+---------+ - | Column | Type | Collation | Nullable | Default | - +===============+=========+===========+==========+=========+ - | timeseries_id | integer | | not null | | - +---------------+---------+-----------+----------+---------+ - | role_id | integer | | not null | | - +---------------+---------+-----------+----------+---------+ - Indexes: - "timeseries_timeseries_roles_pkey" PRIMARY KEY, btree (timeseries_id, role_id) - Foreign-key constraints: - "timeseries_timeseries_roles_role_id_fkey" FOREIGN KEY (role_id) REFERENCES timeseries_roles(id) - "timeseries_timeseries_roles_timeseries_id_fkey" FOREIGN KEY (timeseries_id) REFERENCES timeseries(id) - """ - - __tablename__ = 'timeseries_timeseries_roles' - __table_args__ = ( - PrimaryKeyConstraint('timeseries_id', 'role_id'), - ) -# timeseries_id = Column(ForeignKey(Timeseries.id, deferrable=True, initially='DEFERRED')) -# role_id = Column(ForeignKey(TimeseriesRole.id, deferrable=True, initially='DEFERRED')) - timeseries_id = Column(ForeignKey('timeseries.id', deferrable=True, initially='DEFERRED')) - role_id = Column(ForeignKey('timeseries_roles.id', deferrable=True, initially='DEFERRED')) -## timeseries = relationship(Timeseries, back_populates = 'roles') -## roles = relationship(TimeseriesRole, back_populates = 'timeseries') - - class TimeseriesRole(Base): """ Table "public.timeseries_roles" @@ -113,7 +84,9 @@ class TimeseriesRole(Base): # how to reactivate the following line?! # timeseries_id = Column(Integer, ForeignKey(Timeseries.id), nullable=False) # timeseries = relationship(Timeseries, secondary=timeseries_timeseries_roles, backref="timeseries") - timeseries = relationship(Timeseries, secondary=TimeseriesTimeseriesRoles.__table__, backref="timeseries") + timeseries = relationship("Timeseries", + secondary=timeseries_timeseries_roles_table, + backref="roles") @@ -180,8 +153,6 @@ class Timeseries(Base): CheckConstraint('aggregation >= 0'), CheckConstraint('sampling_frequency >= 0'), UniqueConstraint('station_id', 'variable_id', 'label'), - {'schema': 'public', - 'extend_existing': True} ) id = Column(Integer, primary_key=True, server_default=text("nextval('timeseries_id_seq'::regclass)")) diff --git a/toardb/timeseries/timeseries.py b/toardb/timeseries/timeseries.py index 52d6b1cc6cba49545836ae25cb92c4279739f565..8c0fa82db69367c7fd4cd96b86545eb82f0ed1ba 100644 --- a/toardb/timeseries/timeseries.py +++ b/toardb/timeseries/timeseries.py @@ -23,7 +23,7 @@ def get_db(): # plain views to post and get timeseries #get all entries of table timeseries -@router.get('/timeseries/', response_model=List[schemas.TimeseriesCore]) +@router.get('/timeseries/', response_model=List[schemas.Timeseries]) def get_all_timeseries(skip: int = 0, limit: int = None, db: Session = Depends(get_db)): timeseries = crud.get_all_timeseries(db, skip=skip, limit=limit) return timeseries