Здравствуйте. Сейчас у меня есть код, который выполняет поиск ближайшего аэропорта по координатам и в найденном аэропорту получает город, затем во всех аэропортах города обновляет строку rank. В проекте, поиск выполняется около 16 тысяч раз, что сильно бьёт по оптимизации (чтобы наполнить всю базу, потребуется примерно 9 часов). Вот функция, которая отвечает за поиск и обновления данных. Библиотеки которые здесь используются [GeoAlchemy2==0.14.3, SQLAlchemy~=2.0.29].
class Table_AirportIataInfo(Base):
__tablename__ = "airport_iata_info"
__table_args__ = {"schema": schema_manager.schema_name}
icao = mapped_column(CHAR(4), primary_key=True)
iata = mapped_column(CHAR(3))
name = mapped_column(TEXT)
city = mapped_column(TEXT, index=True)
country = mapped_column(CHAR(2))
lat = mapped_column(FLOAT)
lon = mapped_column(FLOAT)
location = mapped_column(Geometry('POINT'))
rank = mapped_column(BIGINT)
class Query_AirportIataInfo:
@staticmethod
def update_rank_with_location(location: Geometry, rank: int):
with session_factory() as session:
nearest_airport = session.query(Table_AirportIataInfo).order_by(
Table_AirportIataInfo.location.distance_box(location)
).first()
airports = session.query(Table_AirportIataInfo).filter_by(
city=nearest_airport.city, country=nearest_airport.country
).all()
for airport in airports:
airport.rank = rank
session.commit()
Для ускорения кода, пытаюсь реализовать поиск по всем координатам 1 запросом в базу данных. То есть функция
update_rank_with_location будет принимать
List[Tuple[Geometry, int] и 1 запросом выискивать все ближайшие аэропорта по данным из массива, получать города и обновлять rank. Для наглядности приведу пример вызова функции:
data = [
[f"POINT({40.71427} {-74.00597})", 600],
[f"POINT({51.4706} {-0.46194})", 500]
]
Query_AirportIataInfo.update_rank_with_location(data)
Буду благодарен, если поможете или, если дадите полезные ресурсы на эту тему.