from flask import Flask from flask_sqlalchemy import SQLAlchemy from sqlalchemy.exc import IntegrityError from sqlalchemy.engine import Engine from sqlalchemy import event app = Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///test.db" app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False db = SQLAlchemy(app) deployments = db.Table("deployments", db.Column("deployment_id", db.Integer, db.ForeignKey("deployment.id"), primary_key=True), db.Column("sensor_id", db.Integer, db.ForeignKey("sensor.id"), primary_key=True) ) @event.listens_for(Engine, "connect") def set_sqlite_pragma(dbapi_connection, connection_record): cursor = dbapi_connection.cursor() cursor.execute("PRAGMA foreign_keys=ON") cursor.close() class Location(db.Model): id = db.Column(db.Integer, primary_key=True) latitude = db.Column(db.Float, nullable=True) longitude = db.Column(db.Float, nullable=True) altitude = db.Column(db.Float, nullable=True) description=db.Column(db.String(256), nullable=True) sensor = db.relationship("Sensor", back_populates="location", uselist=False) class Deployment(db.Model): id = db.Column(db.Integer, primary_key=True) start = db.Column(db.DateTime, nullable=False) end = db.Column(db.DateTime, nullable=False) name = db.Column(db.String(128), nullable=False) sensors = db.relationship("Sensor", secondary=deployments, back_populates="deployments") class Sensor(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32), nullable=False, unique=True) model = db.Column(db.String(128), nullable=False) location_id = db.Column(db.Integer, db.ForeignKey("location.id"), unique=True) location = db.relationship("Location", back_populates="sensor") measurements = db.relationship("Measurement", back_populates="sensor") deployments = db.relationship("Deployment", secondary=deployments, back_populates="sensors") class Measurement(db.Model): id = db.Column(db.Integer, primary_key=True) sensor_id = db.Column(db.Integer, db.ForeignKey("sensor.id", ondelete="SET NULL")) value = db.Column(db.Float, nullable=False) time = db.Column(db.DateTime, nullable=False) sensor = db.relationship("Sensor", back_populates="measurements")