diff --git a/django_example/admin.py b/django_example/admin.py new file mode 100644 index 0000000000000000000000000000000000000000..e3212afc7bdef5c7ae19404cf3604dd3757ebc1f --- /dev/null +++ b/django_example/admin.py @@ -0,0 +1,50 @@ +from django.contrib import admin +from django.db import models +from .models import Client, Vehicle, Contract, FamilyReports, BMClass, Claims, BlackBox, Agent, Office + +class ClientAdmin(admin.ModelAdmin): + model = Client + list_display = ('name', 'surname', 'fiscalCode', 'email', 'phoneNumber') + +class VehicleAdmin(admin.ModelAdmin): + model = Vehicle + list_display = ('licensePlate', 'fiscalCode', 'model') + +class ContractAdmin(admin.ModelAdmin): + model = Contract + list_display = ('contractId', 'classBM', 'date', 'clientFiscalCode', 'licensePlate', 'renewal') + +class FamilyReportsAdmin(admin.ModelAdmin): + model = FamilyReports + list_display = ('fiscalCode1', 'fiscalCode2', 'relationship') + +class BMClassAdmin(admin.ModelAdmin): + model = BMClass + list_display = ('BMClass', 'basePremium') + +class ClaimsAdmin(admin.ModelAdmin): + model = Claims + list_display = ('licensePlate', 'totalCompensation', 'date', 'location', 'responsibility', 'compensationTimeDays') + +class BlackBoxAdmin(admin.ModelAdmin): + model = BlackBox + list_display = ('licensePlate', 'clientFiscalCode', 'blackBoxId') + +class AgentAdmin(admin.ModelAdmin): + model = Agent + list_display = ('name', 'surname', 'fiscalCode', 'agentId', 'officeId') + +class OfficeAdmin(admin.ModelAdmin): + model = Office + list_display = ('officeId', 'location') + + +admin.site.register(Client, ClientAdmin) +admin.site.register(Vehicle, VehicleAdmin) +admin.site.register(Contract, ContractAdmin) +admin.site.register(FamilyReports, FamilyReportsAdmin) +admin.site.register(BMClass, BMClassAdmin) +admin.site.register(Claims, ClaimsAdmin) +admin.site.register(BlackBox, BlackBoxAdmin) +admin.site.register(Agent, AgentAdmin) +admin.site.register(Office, OfficeAdmin) diff --git a/django_example/insert.py b/django_example/insert.py new file mode 100644 index 0000000000000000000000000000000000000000..a20fcf3637a7c85451cb4cae8f02df57061164f7 --- /dev/null +++ b/django_example/insert.py @@ -0,0 +1,6 @@ +from insurancedb.models import BMClass + +bonus = BMClass(BMClass=2, basePremium=150.00) + +bonus.save() + diff --git a/django_example/models.py b/django_example/models.py new file mode 100644 index 0000000000000000000000000000000000000000..9f6cbc31902651e5f53437594db6d27b89965d3d --- /dev/null +++ b/django_example/models.py @@ -0,0 +1,133 @@ +from django.db import models +from phonenumber_field.modelfields import PhoneNumberField +from django.core.validators import MaxValueValidator, MinValueValidator + +# Create your models here. + +SEX = ('M', 'F') +MARITAL_STATUS = ('celibe', 'coniugato', 'vedovo', 'separato', 'divorziato') +WHEEL_NUMBER = (2,4) +FAMILY_REPORTS = ('primo', 'secondo', 'terzo') +BONUSMALUS_CLASS = (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18) + + +class Client(models.Model): + name = models.CharField(max_length = 20) + surname = models.CharField(max_length = 20) + fiscalCode = models.CharField(max_length = 16, primary_key = True) + residenceRoad = models.CharField(max_length = 30) + streetNumber = models.CharField(max_length = 5) + bithDay = models.DateField() + sex = models.CharField(max_length=1, choices = [(d,d) for d in SEX]) + profession = models.CharField(max_length = 50) + maritalStatus = models.CharField(max_length = 10, choices = [(d,d) for d in MARITAL_STATUS]) + phoneNumber = PhoneNumberField(blank = True, null = True) + email = models.EmailField(max_length = 70, blank = True, null = True) + + def __str__(self): + return "{}, {}, {}".format(self.name, self.surname, self.fiscalCode) + class Meta: + ordering = ['surname'] + + +class Vehicle(models.Model): + licensePlate = models.CharField(max_length = 7, primary_key = True) + fiscalCode = models.ForeignKey(Client, on_delete = models.CASCADE) + engineSize = models.PositiveIntegerField() + model = models.CharField(max_length = 50) + kmTraveled = models.CharField(max_length = 20) + wheelNumber = models.PositiveSmallIntegerField(choices = [(d,d) for d in WHEEL_NUMBER]) + + def __str__(self): + return self.licensePlate + + +class BMClass(models.Model): + BMClass = models.PositiveSmallIntegerField(choices = [(d,d) for d in BONUSMALUS_CLASS], primary_key = True) + basePremium = models.FloatField() + + def __str__(self): + return "{}, {}".format(self.BMClass, self.basePremium) + + +class Contract(models.Model): + contractId = models.CharField(max_length=15, primary_key = True) + date = models.DateTimeField(auto_now_add = True) + clientFiscalCode = models.ForeignKey(Client, on_delete = models.CASCADE) + licensePlate = models.ForeignKey(Vehicle, on_delete = models.CASCADE) + renewal = models.BooleanField() + classBM = models.ForeignKey(BMClass, null = True, on_delete = models.SET_NULL) + totalPremium = models.FloatField(blank = True) + + def __str__(self): + return "{} on {}".format(self.clientFiscalCode, self.date.strftime('%d-%m-%Y')) + + +class FamilyReports(models.Model): + fiscalCode1 = models.ForeignKey(Client, on_delete = models.CASCADE, related_name = "primo") + fiscalCode2 = models.ForeignKey(Client, on_delete = models.CASCADE, related_name = "secondo") + relationship = models.CharField(max_length=7, choices = [(d,d) for d in FAMILY_REPORTS]) + + class Meta: + unique_together = (("fiscalCode1", "fiscalCode2"),) + + def __str__(self): + return self.relationship + + +class Claims(models.Model): + licensePlate = models.ForeignKey(Vehicle, on_delete = models.CASCADE) + totalCompensation = models.FloatField() + date = models.DateTimeField(auto_now_add = True) + location = models.CharField(max_length = 30) + responsibility = models.FloatField(validators = [MinValueValidator(0), MaxValueValidator(100)]) + compensationTimeDays = models.PositiveIntegerField(blank = True) + counterpartLicensePlate = models.CharField(max_length = 7) + counterpartInsuranceCompany = models.CharField(max_length = 50) + photo = models.ImageField(blank = True, null = True) + + def __str__(self): + return "{} paid {}".format(self.licensePlate, self.totalCompensation) + + +class BlackBox(models.Model): + blackBoxId = models.CharField(max_length=10, primary_key = True) + licensePlate = models.ForeignKey(Vehicle, on_delete = models.CASCADE) + clientFiscalCode = models.ForeignKey(Client, on_delete = models.CASCADE) + observationDate = models.DateTimeField(auto_now_add = True) + kmTraveled = models.FloatField(blank = True) + timeTraveledSeconds = models.FloatField(blank = True) + provinceTraveled = models.CharField(max_length = 30) + nationTraveled = models.CharField(max_length = 30) + hourStarting = models.TimeField(auto_now = True) + hourClosing = models.TimeField(auto_now = True) + maxVelocity = models.PositiveSmallIntegerField(blank = True) + timeVelocityOverLimig = models.FloatField(blank = True) + kmVelocityOverLimit = models.FloatField(blank = True) + totalTime = models.FloatField( blank = True) + + def __str__(self): + return self.BlackBoxId + + +class Office(models.Model): + officeId = models.AutoField(primary_key = True) + location = models.CharField(max_length = 30) + + def __str__(self): + return "{}, {}".format(self.officeId, self.location) + + +class Agent(models.Model): + name = models.CharField(max_length = 20) + surname = models.CharField(max_length = 20) + fiscalCode = models.CharField(max_length = 16, primary_key = True) + agentId = models.IntegerField(unique = True) + officeId = models.ForeignKey(Office, default = '', on_delete = models.SET_DEFAULT) + + def __str__(self): + return "{}, {}, {}".format(self.name, self.surname, self.fiscalCode) + class Meta: + ordering = ['surname'] + + diff --git a/django_example/urls.py b/django_example/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..74a428b2df5b780af553592a1e57adc2b1097ca3 --- /dev/null +++ b/django_example/urls.py @@ -0,0 +1,19 @@ +from django.contrib import admin +from django.urls import path +from . import views +from django.views.generic.base import RedirectView + +urlpatterns = [ + path('admin/', admin.site.urls), + path('', RedirectView.as_view(url = 'admin/')), + path('insurancedb/', views.insurancedb), + path('blackbox/', views.blackbox), + path('bmclass/', views.bmclass), + path('vehicle/', views.vehicle), + path('claims/', views.claims), + path('client/', views.client), + path('contract/', views.contract), + path('familyreports/', views.familyreports), + path('agent/', views.agent), + path('office/', views.office), + path('add/', views.add)] diff --git a/django_example/views.py b/django_example/views.py new file mode 100644 index 0000000000000000000000000000000000000000..22a9e1f43c69cc14e88a37ca49fe9de2b7bd5c0b --- /dev/null +++ b/django_example/views.py @@ -0,0 +1,34 @@ +from django.http import HttpResponse + +def insurancedb(request): + return HttpResponse('insurancedb') + +def blackbox(request): + return HttpResponse('blackbox') + +def bmclass(request): + return HttpResponse('bmclass') + +def vehicle(request): + return HttpResponse('vehicle') + +def claims(request): + return HttpResponse('claims') + +def client(request): + return HttpResponse('client') + +def contract(request): + return HttpResponse('contract') + +def familyreports(request): + return HttpResponse('familyreports') + +def agent(request): + return HttpResponse('agent') + +def office(request): + return HttpResponse('office') + +def add(request): + return HttpResponse('add') diff --git a/euclid_example/README.md b/euclid_example/README.md index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ec2f30294bfc943b56383001cfc89a7e50b8f6ac 100644 --- a/euclid_example/README.md +++ b/euclid_example/README.md @@ -0,0 +1,33 @@ +# ORM Example - Euclid + + git clone https://www.ict.inaf.it/gitlab/odmc/orm_example.git + cd orm_example/euclid_example + +Crea l'ambiente di anaconda + + conda create -n euclid_example + conda activate euclid_example + pip install django-extensions djangorestframework django-composite-field django-url-filter + +python manage.py migrate + +python manage.py shell + +python manage.py runserver + +add admin password + + +## Start from scratch + + django-admin startproject euclid_example + cd euclid_example + python manage.py startapp imagedb + +Also in settings.py you have to add the name of the app imagedb + +In the imagedb/models.py add the data model classes + +Once we have defined our data model in imagedb/models.py we need Django to create the corresponding DB schema + +python manage.py makemigrations diff --git a/sqlalchemy_example/README.md b/sqlalchemy_example/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0fb1f1e09208b53f90c6201cf91810ca248c4e04 --- /dev/null +++ b/sqlalchemy_example/README.md @@ -0,0 +1,14 @@ + +Create the anaconda environment for this set of examples + + conda create -n orm_sqlalchemy sqlalchemy + +## # To activate this environment, use +# +# $ conda activate orm_sqlalchemy +# +# To deactivate an active environment, use +# +# $ conda deactivate + + diff --git a/sqlalchemy_example/example_1/create.py b/sqlalchemy_example/example_1/create.py new file mode 100644 index 0000000000000000000000000000000000000000..115a17bec516e7edcc03038ec746e784d3994035 --- /dev/null +++ b/sqlalchemy_example/example_1/create.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from mapping import Base + +Base.metadata.create_all() diff --git a/sqlalchemy_example/example_1/filter.py b/sqlalchemy_example/example_1/filter.py new file mode 100644 index 0000000000000000000000000000000000000000..5cc2ee0f6f857821b671c41c7c5083fb0d403732 --- /dev/null +++ b/sqlalchemy_example/example_1/filter.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from mapping import Car +from mapping import Session +from sqlalchemy.sql import and_ + +# Create a Session object +session = Session() + +# Query cars with name ending with 'en' +results = session.query(Car).filter(Car.name.like('%en')) + +# Print the results +print("Cars with name ending with 'en' are:") +for car in results: + print(car.name) +print() + +# Query cars filtered by id +results = session.query(Car).filter(Car.id.in_([2, 4, 6, 8])) + +# Print the results +print("Cars with id in [2, 4, 6, 8] are:") +for car in results: + print(car.id, car.name) +print() + +# Query cars filtered by price +results = session.query(Car).filter(and_(Car.price > 10000, + Car.price < 40000)) + +# Print the results +print("Cars with price between 10000 and 40000 are:") +for car in results: + print(car.name, car.price) + + +# Close session +session.close() diff --git a/sqlalchemy_example/example_1/insert.py b/sqlalchemy_example/example_1/insert.py new file mode 100644 index 0000000000000000000000000000000000000000..9cf45826fbbfde4c6476677bc6494497e5d959cc --- /dev/null +++ b/sqlalchemy_example/example_1/insert.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from mapping import Car +from mapping import Session + +# Create a Session object +session = Session() + +# Add instances of Car objects to the session +session.add_all( + [Car(id=1, name='Audi', price=52642), + Car(id=2, name='Mercedes', price=57127), + Car(id=3, name='Skoda', price=9000), + Car(id=4, name='Volvo', price=29000), + Car(id=5, name='Bentley', price=350000), + Car(id=6, name='Citroen', price=21000), + Car(id=7, name='Hummer', price=41400), + Car(id=8, name='Volkswagen', price=21600)]) + +# Commit changes to database +session.commit() + +# Close session +session.close() diff --git a/sqlalchemy_example/example_1/mapping.py b/sqlalchemy_example/example_1/mapping.py new file mode 100644 index 0000000000000000000000000000000000000000..037c38c42a7260cf75f3cec33cbe1a711799082f --- /dev/null +++ b/sqlalchemy_example/example_1/mapping.py @@ -0,0 +1,27 @@ +from sqlalchemy import create_engine +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker + +from sqlalchemy import Column, Integer, String + + +# Create a new Engine instance. +engine = create_engine('sqlite:///example_1.db') + + +# Construct a base class for declarative class definitions +# and bind it to engine +Base = declarative_base(engine) + + +# Declarative mapping for Car +class Car(Base): + __tablename__ = "car" + + id = Column(Integer, primary_key=True) + name = Column(String) + price = Column(Integer) + + +# Create a configurable Session factory. +Session = sessionmaker(bind=engine) diff --git a/sqlalchemy_example/example_1/read.py b/sqlalchemy_example/example_1/read.py new file mode 100644 index 0000000000000000000000000000000000000000..f4a3448360238cc3b06e228f78e9b450d7bb1035 --- /dev/null +++ b/sqlalchemy_example/example_1/read.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from mapping import Car +from mapping import Session + +# Create a Session object +session = Session() + +# Query all the cars +results = session.query(Car).all() + +# Print the results +for car in results: + print("The price of", car.name, "is", car.price) + +# Close session +session.close() diff --git a/sqlalchemy_example/example_2/create.py b/sqlalchemy_example/example_2/create.py new file mode 100644 index 0000000000000000000000000000000000000000..115a17bec516e7edcc03038ec746e784d3994035 --- /dev/null +++ b/sqlalchemy_example/example_2/create.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from mapping import Base + +Base.metadata.create_all() diff --git a/sqlalchemy_example/example_2/filter.py b/sqlalchemy_example/example_2/filter.py new file mode 100644 index 0000000000000000000000000000000000000000..a51baacb830eff786bfaac525f6a1fb729221b76 --- /dev/null +++ b/sqlalchemy_example/example_2/filter.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from mapping import Author, Book +from mapping import Session + +# Create a Session object +session = Session() + +# Query Author to select Lev Tolstoy +results = session.query(Author).filter(Author.name=="Lev Tolstoy").first() + +# Print all books of Lev Tolstoy +print('Books of Lev Tolstoy are:') +for book in results.book: + print(book.title) +print() + +# Query Book for the book Emma and get its author +results = session.query(Book).filter(Book.title=="Emma").first() + +print('The author of', results.title, 'is', results.author.name) + +# Close session +session.close() + diff --git a/sqlalchemy_example/example_2/insert.py b/sqlalchemy_example/example_2/insert.py new file mode 100644 index 0000000000000000000000000000000000000000..734043ed980259d9e72335522f426e14584c8f74 --- /dev/null +++ b/sqlalchemy_example/example_2/insert.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from mapping import Author, Book +from mapping import Session + +# Create a Session object +session = Session() + +# Add instances of Author and Book objects to the session +session.add_all( + [Author(id=1, name='Lev Tolstoy'), + Author(id=2, name='Jane Austen'), + Author(id=3, name='Charles Dickens'), + Book(id=1, title='War and Peace', author_id=1), + Book(id=2, title='Anna Karenina', author_id=1), + Book(id=3, title='Emma', author_id=2), + Book(id=4, title='David Copperfield', author_id=3)]) + +# Commit changes to database +session.commit() + +# Close session +session.close() diff --git a/sqlalchemy_example/example_2/mapping.py b/sqlalchemy_example/example_2/mapping.py new file mode 100644 index 0000000000000000000000000000000000000000..ab9f931dc18460c289cfe1bf3b884fe79ccf2c3b --- /dev/null +++ b/sqlalchemy_example/example_2/mapping.py @@ -0,0 +1,44 @@ +from sqlalchemy import create_engine, event +from sqlalchemy.engine import Engine +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy import Column, Integer, String, ForeignKey +from sqlalchemy.orm import sessionmaker, relationship + +from sqlite3 import Connection as SQLite3Connection + +# Create a new Engine instance. +engine = create_engine('sqlite:///example_2.db') + + +# Construct a base class for declarative class definitions +# and bind it to engine +Base = declarative_base(engine) + +# Declarative mapping for Author and Book classes +class Author(Base): + __tablename__ = "author" + + id = Column(Integer, primary_key=True) + name = Column(String) + + book = relationship("Book") + +class Book(Base): + __tablename__ = "book" + + id = Column(Integer, primary_key=True) + title = Column(String) + author_id = Column(Integer, ForeignKey("Author.id")) + + author = relationship("Author") + +# Enable foreign key constraint in SQLite +@event.listens_for(Engine, "connect") +def _set_sqlite_pragma(dbapi_connection, connection_record): + if isinstance(dbapi_connection, SQLite3Connection): + cursor = dbapi_connection.cursor() + cursor.execute("PRAGMA foreign_keys=ON;") + cursor.close() + +# Create a configurable Session factory. +Session = sessionmaker(bind=engine) diff --git a/sqlalchemy_example/example_3/create.py b/sqlalchemy_example/example_3/create.py new file mode 100644 index 0000000000000000000000000000000000000000..115a17bec516e7edcc03038ec746e784d3994035 --- /dev/null +++ b/sqlalchemy_example/example_3/create.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from mapping import Base + +Base.metadata.create_all() diff --git a/sqlalchemy_example/example_3/filter.py b/sqlalchemy_example/example_3/filter.py new file mode 100644 index 0000000000000000000000000000000000000000..b75bc34593c0e15c198f95ec7df46b56fc6f638b --- /dev/null +++ b/sqlalchemy_example/example_3/filter.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from mapping import Client, Person, Company +from mapping import Session + +# Create a Session object +session = Session() + +# Query Client with address via Flavia +results = session.query(Client).filter(Client.address=='via Flavia') + +# Print results +print('Clients in via Flavia are:') +for client in results: + if client.type == 'person': + print(client.id, client.name, client.surname) + elif client.type == 'company': + print(client.id, client.company_name, client.industry) +print() + +# Query Person with address via Flavia +results = session.query(Person).filter(Person.address=='via Flavia') + +# Print results +print('Persons in via Flavia are:') +for client in results: + if client.type == 'person': + print(client.id, client.name, client.surname) + elif client.type == 'company': + print(client.id, client.company_name, client.industry) + + +# Close session +session.close() + diff --git a/sqlalchemy_example/example_3/insert.py b/sqlalchemy_example/example_3/insert.py new file mode 100644 index 0000000000000000000000000000000000000000..dd836ca864b7565989f8a6909d4390f3208803f5 --- /dev/null +++ b/sqlalchemy_example/example_3/insert.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from mapping import Client, Person, Company +from mapping import Session + +# Create a Session object +session = Session() + +# Add instances of Person and Company objects to the session +session.add_all([ + Person(name='Mario', surname='Rossi', address='via Giulia'), + Person(name='Luigi', surname='Bianchi', address='via Flavia'), + Company(company_name='Acegas', industry='multi-utility', address='via del Teatro'), + Company(company_name='Illy', industry='coffee', address='via Flavia') + ]) + +# Commit changes to database +session.commit() + +# Close session +session.close() diff --git a/sqlalchemy_example/example_3/mapping.py b/sqlalchemy_example/example_3/mapping.py new file mode 100644 index 0000000000000000000000000000000000000000..da9912fd715893f796e2dccca287c37cad3e25bb --- /dev/null +++ b/sqlalchemy_example/example_3/mapping.py @@ -0,0 +1,54 @@ +from sqlalchemy import create_engine +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy import Column, Integer, String, ForeignKey +from sqlalchemy.orm import sessionmaker, relationship + +# Create a new Engine instance. +engine = create_engine('sqlite:///example_3.db') + + +# Construct a base class for declarative class definitions +# and bind it to engine +Base = declarative_base(engine) + +# Declarative mapping for Client +class Client(Base): + __tablename__ = 'client' + + id = Column(Integer, primary_key=True) + address = Column(String) + type = Column(String) + + __mapper_args__ = { + 'polymorphic_identity':'client', + 'polymorphic_on':type + } + +# Declarative mapping for Person +class Person(Client): + __tablename__ = 'person' + + id = Column(Integer, ForeignKey('client.id'), primary_key=True) + name = Column(String) + surname = Column(String) + + __mapper_args__ = { + 'polymorphic_identity':'person', + } + +# Declarative mapping for Company +class Company(Client): + __tablename__ = 'company' + + id = Column(Integer, ForeignKey('client.id'), primary_key=True) + company_name = Column(String) + industry = Column(String) + + client = relationship("Client") + + __mapper_args__ = { + 'polymorphic_identity':'company', + } + +# Create a configurable Session factory. +Session = sessionmaker(bind=engine)