kopia lustrzana https://github.com/glidernet/ogn-python
New command: update_relations
rodzic
aaac0029f6
commit
51ea4e2fad
|
@ -1,8 +1,11 @@
|
||||||
from ogn.commands.dbutils import engine, session
|
from ogn.commands.dbutils import engine, session
|
||||||
from ogn.model import Base, AddressOrigin
|
from ogn.model import Base, AddressOrigin, AircraftBeacon, ReceiverBeacon, Device, Receiver
|
||||||
from ogn.utils import get_airports
|
from ogn.utils import get_airports
|
||||||
from ogn.collect.database import update_device_infos
|
from ogn.collect.database import update_device_infos
|
||||||
|
|
||||||
|
from sqlalchemy import insert, distinct
|
||||||
|
from sqlalchemy.sql import null
|
||||||
|
|
||||||
from manager import Manager
|
from manager import Manager
|
||||||
manager = Manager()
|
manager = Manager()
|
||||||
|
|
||||||
|
@ -78,3 +81,50 @@ def import_airports(path='tests/SeeYou.cup'):
|
||||||
session.bulk_save_objects(airports)
|
session.bulk_save_objects(airports)
|
||||||
session.commit()
|
session.commit()
|
||||||
print("Imported {} airports.".format(len(airports)))
|
print("Imported {} airports.".format(len(airports)))
|
||||||
|
|
||||||
|
|
||||||
|
@manager.command
|
||||||
|
def update_relations():
|
||||||
|
"""Update AircraftBeacon and ReceiverBeacon relations"""
|
||||||
|
|
||||||
|
# Create missing Receiver from ReceiverBeacon
|
||||||
|
available_receivers = session.query(Receiver.name) \
|
||||||
|
.subquery()
|
||||||
|
|
||||||
|
missing_receiver_query = session.query(distinct(ReceiverBeacon.name)) \
|
||||||
|
.filter(ReceiverBeacon.receiver_id == null()) \
|
||||||
|
.filter(~ReceiverBeacon.name.in_(available_receivers))
|
||||||
|
|
||||||
|
ins = insert(Receiver).from_select([Receiver.name], missing_receiver_query)
|
||||||
|
session.execute(ins)
|
||||||
|
|
||||||
|
# Create missing Device from AircraftBeacon
|
||||||
|
available_addresses = session.query(Device.address) \
|
||||||
|
.subquery()
|
||||||
|
|
||||||
|
missing_addresses_query = session.query(distinct(AircraftBeacon.address)) \
|
||||||
|
.filter(AircraftBeacon.device_id == null()) \
|
||||||
|
.filter(~AircraftBeacon.address.in_(available_addresses))
|
||||||
|
|
||||||
|
ins2 = insert(Device).from_select([Device.address], missing_addresses_query)
|
||||||
|
session.execute(ins2)
|
||||||
|
|
||||||
|
# Update AircraftBeacons
|
||||||
|
upd = session.query(AircraftBeacon) \
|
||||||
|
.filter(AircraftBeacon.device_id == null()) \
|
||||||
|
.filter(AircraftBeacon.receiver_id == null()) \
|
||||||
|
.filter(AircraftBeacon.address == Device.address) \
|
||||||
|
.filter(AircraftBeacon.receiver_name == Receiver.name) \
|
||||||
|
.update({AircraftBeacon.device_id: Device.id,
|
||||||
|
AircraftBeacon.receiver_id: Receiver.id},
|
||||||
|
synchronize_session='fetch')
|
||||||
|
|
||||||
|
upd2 = session.query(ReceiverBeacon) \
|
||||||
|
.filter(ReceiverBeacon.receiver_id == null()) \
|
||||||
|
.filter(ReceiverBeacon.receiver_name == Receiver.name) \
|
||||||
|
.update({Receiver.name: ReceiverBeacon.receiver_name},
|
||||||
|
synchronize_session='fetch')
|
||||||
|
|
||||||
|
session.commit()
|
||||||
|
print("Updated {} AircraftBeacons and {} ReceiverBeacons".
|
||||||
|
format(upd, upd2))
|
||||||
|
|
Ładowanie…
Reference in New Issue