抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

前言

Umami Cloud 有两个明显的限制

  1. 免费版只有 1 年数据保留
  2. 只能添加 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 按钮,选择你要导出的网站,点击导出后会发送一个下载链接到你邮箱里。注意 下载链接 可能要你对它施加魔法才能打开。

导出 Umami Cloud 数据

数据处理

需要使用 Python 脚本对数据进行处理,可以从 GitHub 下载脚本或使用 Huggingface Space

按照脚本或网站提示进行操作,将旧站点 ID 替换为新站点 ID。

处理完数据后,您将看到生成的两个文件,它们是 website_event.csvseesion.csv

导入数据

  1. PostgreSQL 导入CSV文件到PostgreSQL
  2. MySQL:如何将CSV文件导入MySQL表中?

解决 PostgreSQL session 表唯一键冲突错误问题(我不知道 MySQL 会不会有这个问题)

方法一,把约束给删了,(这段完全抄他的)

  1. Remove Primary Key Constraint(删除主键约束):这将允许表中的重复值。执行以下命令:session_id
1
ALTER TABLE session DROP CONSTRAINT session_pkey;
  1. 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 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,就能看到你导入的数据都已正确显示了。

相关链接

  1. 《How to Import a CSV from Umami Cloud to Self-Hosted Umami》
  2. https://github.com/umami-software/umami/issues/2653#issuecomment-2040970801
  3. https://github.com/umami-software/umami/issues/2456
  4. RoversX/umami-csv-import-script
  5. Huggingface Space | Umami Data Processing

评论