转自我博客文章
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 session
表唯一键冲突错误问题~~(我不知道 MySQL 会不会有这个问题)~~
方法一,把约束给删了,(这段完全抄他的)
- Remove Primary Key Constraint(删除主键约束):这将允许表中的重复值。执行以下命令:
session_id
ALTER TABLE session DROP CONSTRAINT session_pkey;
- Remove Unique Index(删除唯一索引):通过执行以下命令删除唯一性约束:
session_id
DROP INDEX session_session_id_key;
删除这些约束后,您的表将能够接受重复值。但是,请注意,主键和唯一索引通常用于确保数据完整性和优化性能,删除它们可能会导致其他问题。session_id
方法一,跳过唯一键冲突错误的地方
运行下列 python 代码,注意填写好 PostgreSQL 配置和 session.csv 文件路径
import psycopg2
import csv
import os
import sys
from tqdm import tqdm # 导入 tqdm
def log_error(message, log_file='error_log.txt'):
with open(log_file, 'a') as f:
f.write(message + '\n')
# PostgreSQL 配置
# url 格式的
# connection_string = "postgresql://postgres.giqgawwiggsqxwcwewvc:[YOUR-PASSWORD]@aws-0-us-east-1.pooler.supabase.com:6543/postgres"
connection = psycopg2.connect(
host="<远程服务器IP或域名>",
database="<数据库名>",
user="<用户名>",
password="<密码>",
port="<端口号>" # 默认端口是5432
)
try:
connection = psycopg2.connect(connection_string)
cursor = connection.cursor()
# session.csv 文件路径
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]
# 创建动态插入SQL语句
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