3 changed files with 81 additions and 0 deletions
@ -0,0 +1,6 @@ |
|||||
|
.idea/ |
||||
|
|
||||
|
venv/ |
||||
|
|
||||
|
.env |
||||
|
|
@ -0,0 +1,5 @@ |
|||||
|
|
||||
|
python-dotenv |
||||
|
|
||||
|
mysql-connector-python |
||||
|
algoliasearch==3.0.0 |
@ -0,0 +1,70 @@ |
|||||
|
import os |
||||
|
|
||||
|
from algoliasearch.search_client import SearchClient |
||||
|
from dotenv import load_dotenv |
||||
|
|
||||
|
import mysql.connector |
||||
|
|
||||
|
|
||||
|
load_dotenv() |
||||
|
|
||||
|
MARIADB_CONFIG = { |
||||
|
'host': os.getenv('MARIADB_HOSTNAME'), |
||||
|
'user': os.getenv('MARIADB_USERNAME'), |
||||
|
'password': os.getenv('MARIADB_PASSWORD'), |
||||
|
'database': os.getenv('MARIADB_DATABASE') |
||||
|
} |
||||
|
ALGOLIA_APP_ID = os.getenv('ALGOLIA_APP_ID') |
||||
|
ALGOLIA_API_KEY = os.getenv('ALGOLIA_API_ADMIN_KEY') |
||||
|
|
||||
|
MARIADB_CONNECTION = mysql.connector.connect(**MARIADB_CONFIG) |
||||
|
MARIADB_CURSOR = MARIADB_CONNECTION.cursor(dictionary=True) |
||||
|
|
||||
|
ALGOLIA_CLIENT = SearchClient.create(ALGOLIA_APP_ID, ALGOLIA_API_KEY) |
||||
|
|
||||
|
def fetch_mariadb_data(table_name: str): |
||||
|
query = f"SELECT ID,Title FROM {table_name};" |
||||
|
MARIADB_CURSOR.execute(query) |
||||
|
return MARIADB_CURSOR.fetchall() |
||||
|
|
||||
|
|
||||
|
def sync(index_name: str, table_name: str): |
||||
|
index = ALGOLIA_CLIENT.init_index(index_name) |
||||
|
|
||||
|
db_data = fetch_mariadb_data(table_name=table_name) |
||||
|
print(db_data) |
||||
|
db_dict = {str(row['ID']): row for row in db_data} |
||||
|
|
||||
|
algolia_objects = [] |
||||
|
for hit in index.browse_objects(): |
||||
|
algolia_objects.append(hit) |
||||
|
|
||||
|
algolia_dict = {obj["objectID"]: obj for obj in algolia_objects} |
||||
|
|
||||
|
to_upsert = [] |
||||
|
for db_id, db_row in db_dict.items(): |
||||
|
if db_id not in algolia_dict or db_row != algolia_dict[db_id]: |
||||
|
db_row["objectID"] = db_id # Algolia requires "objectID" |
||||
|
to_upsert.append({ |
||||
|
"objectID": db_id, |
||||
|
"title": db_row["Title"], |
||||
|
}) |
||||
|
|
||||
|
to_delete = [obj_id for obj_id in algolia_dict if obj_id not in db_dict] |
||||
|
|
||||
|
if to_upsert: |
||||
|
index.save_objects(to_upsert) |
||||
|
print(f"Upserted {len(to_upsert)} objects.") |
||||
|
|
||||
|
if to_delete: |
||||
|
index.delete_objects(to_delete) |
||||
|
print(f"Deleted {len(to_delete)} objects.") |
||||
|
|
||||
|
|
||||
|
if __name__ == "__main__": |
||||
|
try: |
||||
|
sync('FolkTunes_LIVE', 'Tunes') |
||||
|
sync('Dances_LIVE', 'Dances') |
||||
|
finally: |
||||
|
MARIADB_CURSOR.close() |
||||
|
MARIADB_CONNECTION.close() |
Loading…
Reference in new issue