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