将 Umami Cloud 数据导出迁入到自搭建的 Umami

转自我博客文章

Posts: 将 Umami Cloud 数据导出迁入到自搭建的 Umami

注意文章更新都在博客中哟。(懒虫一条)

前言

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.csv seesion.csv

导入数据

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

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

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

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

相关链接

  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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值