Posts: 将 Umami Cloud 数据导出迁入到自搭建的 Umami
前言 Umami Cloud 有两个明显的限制
免费版只有 1 年数据保留 只能添加 3 个网站 1 年的数据保留肯定不够用,我还想记录好几年呢。
Umami 的数据导入/导出似乎只是 Umami Cloud 有,而自搭建的则没有导入/导出这个选项,希望 Umami 开发团队能够添加导入/导功能。
本文指导大家如何将 Umami Cloud 的数据导出并迁移到自搭建的 Umami。
本文的很多内容参考了《How to Import a CSV from Umami Cloud to Self-Hosted Umami》
导出 Umami Cloud 数据 在 Umami Cloud 的左侧栏打开 Data
,点击 Export
按钮,选择你要导出的网站,点击导出后会发送一个下载链接到你邮箱里。注意 下载链接
可能要你对它施加魔法才能打开。
数据处理 需要使用 Python 脚本对数据进行处理,可以从 GitHub 下载脚本 或使用 Huggingface Space 。
按照脚本或网站提示进行操作,将旧站点 ID 替换为新站点 ID。
处理完数据后,您将看到生成的两个文件,它们是 website_event.csv
和 seesion.csv
。
导入数据 PostgreSQL 导入CSV文件到PostgreSQL MySQL:如何将CSV文件导入MySQL表中? 解决 PostgreSQL session
表唯一键冲突错误问题(我不知道 MySQL 会不会有这个问题)
方法一,把约束给删了,(这段完全抄他的) Remove Primary Key Constraint(删除主键约束):这将允许表中的重复值。执行以下命令:session_id
1 ALTER TABLE session DROP CONSTRAINT session_pkey;
Remove Unique Index(删除唯一索引):通过执行以下命令删除唯一性约束:session_id
1 DROP INDEX session_session_id_key;
删除这些约束后,您的表将能够接受重复值。但是,请注意,主键和唯一索引通常用于确保数据完整性和优化性能,删除它们可能会导致其他问题。session_id
方法二,跳过唯一键冲突错误的地方 运行下列 python 代码,注意填写好 PostgreSQL 配置和 session.csv 文件路径
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 import psycopg2import csvimport osimport sysfrom tqdm import tqdm def log_error (message, log_file='error_log.txt' ): with open (log_file, 'a' ) as f: f.write(message + '\n' ) connection = psycopg2.connect( host="<远程服务器IP或域名>" , database="<数据库名>" , user="<用户名>" , password="<密码>" , port="<端口号>" ) try : connection = psycopg2.connect(connection_string) cursor = connection.cursor() csv_file_path = r"C:\Users\live\Downloads\session.csv" with open (csv_file_path, mode='r' , encoding='utf-8' ) as file: reader = csv.DictReader(file) total_rows = sum (1 for _ in file) - 1 file.seek(0 ) next (reader) rows_inserted = 0 for row_number, row in enumerate (tqdm(reader, total=total_rows, desc="Importing" ), start=1 ): columns = row.keys() values = [row[col] for col in columns] insert_query = f""" INSERT INTO session ({',' .join(columns)} ) VALUES ({',' .join(['%s' ] * len (columns))} ) ON CONFLICT DO NOTHING; """ try : cursor.execute(insert_query, values) rows_inserted += cursor.rowcount except psycopg2.IntegrityError as e: connection.rollback() log_error(f"Row {row_number} - Data: {row} - IntegrityError: {e} " ) except Exception as e: connection.rollback() log_error(f"Row {row_number} - Data: {row} - Error: {e} " ) connection.commit() print (f"Total rows inserted: {rows_inserted} " ) except Exception as error: print ("Error while connecting to PostgreSQL:" , error) log_error(f"Connection Error: {error} " ) finally : if connection: cursor.close() connection.close() print ("PostgreSQL connection is closed" )
完 最后,打开你的 Umami,就能看到你导入的数据都已正确显示了。
相关链接 《How to Import a CSV from Umami Cloud to Self-Hosted Umami》 https://github.com/umami-software/umami/issues/2653#issuecomment-2040970801 https://github.com/umami-software/umami/issues/2456 RoversX/umami-csv-import-script Huggingface Space | Umami Data Processing