libs.functions.tools.member

libs/functions/tools/member.py

 1"""
 2libs/functions/tools/member.py
 3"""
 4
 5import logging
 6
 7import pandas as pd
 8
 9import libs.global_value as g
10from libs.data import modify
11from libs.utils import dbutil
12
13
14def export_data():
15    """メンバー情報エクスポート"""
16    if g.args.export_data:
17        for table in ("member", "alias", "team"):
18            csvfile = f"{g.args.export_data}_{table}.csv"
19
20            match table:
21                case "member":
22                    sql = f"select name, slack_id, flying, reward, abuse, team_id from {table} where id != 0;"
23                case _:
24                    sql = f"select * from {table};"
25
26            df = pd.read_sql(sql, dbutil.get_connection())
27            # 整数値を維持
28            if "team_id" in df.columns:
29                df["team_id"] = df["team_id"].astype("Int64")
30
31            df.to_csv(csvfile, index=False)
32            logging.notice("export data: %s -> %s", table, csvfile)  # type: ignore
33
34
35def import_data():
36    """メンバー情報インポート"""
37    if g.args.import_data:
38        modify.db_backup()
39        conn = dbutil.get_connection()
40        for table in ("member", "alias", "team"):
41            csvfile = f"{g.args.import_data}_{table}.csv"
42            conn.execute(f"delete from {table};")
43
44            if table == "member":
45                conn.execute(f"delete from sqlite_sequence where name='{table}';")
46                conn.execute("insert into member (id, name) values (0, ?)", (g.cfg.member.guest_name,))
47
48            try:
49                pd.read_csv(csvfile).to_sql(
50                    table,
51                    conn,
52                    if_exists="append",
53                    index=False,
54                )
55                logging.notice("import data: %s -> %s", csvfile, table)  # type: ignore
56            except FileNotFoundError:
57                logging.notice("skip: %s (not found)", csvfile)  # type: ignore
58            except pd.errors.EmptyDataError:
59                logging.notice("skip: %s (empty file)", csvfile)  # type: ignore
60
61        # aliasテーブルが空の場合は作り直す
62        alias_list = conn.execute("select name from alias;").fetchall()
63        member_list = conn.execute("select name, name from member where id != 0;").fetchall()
64        if not alias_list:
65            logging.warning("create new alias table")
66            for name in member_list:
67                conn.execute("insert into alias(name, member) values (?,?);", name)
68
69        conn.commit()
70        conn.close()
def export_data():
15def export_data():
16    """メンバー情報エクスポート"""
17    if g.args.export_data:
18        for table in ("member", "alias", "team"):
19            csvfile = f"{g.args.export_data}_{table}.csv"
20
21            match table:
22                case "member":
23                    sql = f"select name, slack_id, flying, reward, abuse, team_id from {table} where id != 0;"
24                case _:
25                    sql = f"select * from {table};"
26
27            df = pd.read_sql(sql, dbutil.get_connection())
28            # 整数値を維持
29            if "team_id" in df.columns:
30                df["team_id"] = df["team_id"].astype("Int64")
31
32            df.to_csv(csvfile, index=False)
33            logging.notice("export data: %s -> %s", table, csvfile)  # type: ignore

メンバー情報エクスポート

def import_data():
36def import_data():
37    """メンバー情報インポート"""
38    if g.args.import_data:
39        modify.db_backup()
40        conn = dbutil.get_connection()
41        for table in ("member", "alias", "team"):
42            csvfile = f"{g.args.import_data}_{table}.csv"
43            conn.execute(f"delete from {table};")
44
45            if table == "member":
46                conn.execute(f"delete from sqlite_sequence where name='{table}';")
47                conn.execute("insert into member (id, name) values (0, ?)", (g.cfg.member.guest_name,))
48
49            try:
50                pd.read_csv(csvfile).to_sql(
51                    table,
52                    conn,
53                    if_exists="append",
54                    index=False,
55                )
56                logging.notice("import data: %s -> %s", csvfile, table)  # type: ignore
57            except FileNotFoundError:
58                logging.notice("skip: %s (not found)", csvfile)  # type: ignore
59            except pd.errors.EmptyDataError:
60                logging.notice("skip: %s (empty file)", csvfile)  # type: ignore
61
62        # aliasテーブルが空の場合は作り直す
63        alias_list = conn.execute("select name from alias;").fetchall()
64        member_list = conn.execute("select name, name from member where id != 0;").fetchall()
65        if not alias_list:
66            logging.warning("create new alias table")
67            for name in member_list:
68                conn.execute("insert into alias(name, member) values (?,?);", name)
69
70        conn.commit()
71        conn.close()

メンバー情報インポート