1

私はPythonスクリプトを使用して、私が見ているアニメ番組のsqliteデータベースを作成および維持して、それらと私が持っているエピソードと取得する必要があるエピソードをよりよく追跡できるようにしています.

スクリプトを使用して、ブリーチ、ブラック ラグーンなどの各シリーズのテーブルを作成します。これらの各テーブルには、次の情報が保存されます。

シリーズ表:

Season_Num         # Unique season number
I_Have_Season      # yes or no to say I have a directory for that season
Season_Episodes    # Amount of episodes according to the TVDB that are in that season
Episodes_I_Have    # The numer of episodes I have for that season

私が持っているすべてのシリーズに対して同じテーブルが作成され、そのシリーズの各シーズンの行が正常に機能しているようです。

今私がやろうとしているのは、各シリーズのテーブルから情報を取得し、必要なすべての情報を含むテーブルを 1 つだけ作成する要約テーブルを作成することです。次の情報があります。

要約表:

Series          # Unique Series name
Alt_Name        # Alternate name (The series name in english)
Special_Eps     # The amount of Special episodes (Season 0 in the series table)
Special_Eps_Me  # The number of Special Episodes I have
Tot_Ses         # The total count of the Seasons (excluding season 0)
Tot_Ses_Me      # The total count of Seasons that have yes in I_Have_Season column
Tot_Episodes    # Total Episodes excluding season 0 episodes
Tot_Eps_Me      # Total Episodes I have excluding season 0 episodes

私がやりたいことはトリガーを使用して実行できると思いますが、たとえばシリーズ テーブルに新しいシーズンが追加された場合やシリーズ テーブルの値が変更された場合に集計テーブルが自動的に更新されるようにトリガーを実装する方法がわかりません。

アップデート:

もう少し考えて研究した後のテーブルの代わりにビューに関するファビアンのアイデアは、私が望むもののように聞こえますが、可能であれば、すべてのシリーズで1つのテーブルだけを持つのではなく、更新のために各シリーズを独自のテーブルに個別に保持したいと思いますそして季節ごとに混ざり合っています。

更新 2:

私は先に進み、INSERT、UPDATE、および DELETE のトリガーを入れました。テーブル名に変数を使用して、スクリプトの最初の作成ループにそれらを追加しました。サマリー テーブルは正常に更新されているようです (いくつかの値がどのように修正されたかを修正した後)。計算されました)。私はそれをさらにテストし、うまくいけばそれが機能し続けるでしょう. ここで、スクリプトを取得して、新しいシリーズと削除するシリーズのテーブルを追加および削除する必要があります。

4

1 に答える 1

1

これは、トリガーを使用して実現できます。しかし、この種のことは通常、ビューを使用して宣言的に行う方が適切です。

例えば、

create table series (
  series_name,
  alt_name,
  special_eps,
  special_eps_me,
  primary key(series_name)
);

create table seasons (
  series_name,
  season_num,         
  i_have_season, 
  episodes, 
  episodes_i_have,
  primary key (series_name,season_num),
  foreign key (series_name) references series (series_name),
  check (i_have_season in ('F','T'))
);

create view everything_with_counts as 
select series_name, 
       alt_name, 
       special_eps, 
       special_eps_me, 
       (select count(*) from seasons  where seasons.series_name = series.series_name) as tot_ses,
       (select count(*) from seasons  where seasons.series_name = series.series_name and i_have_season = 'T') as tot_ses_me,
       (select sum(episodes) from seasons where seasons.series_name = series.series_name) as tot_epsiodes,
       (select sum(episodes_i_have) from seasons where seasons.series_name = series.series_name and i_have_season = 'T') as tot_epsiodes_me
from series;

編集

トリガーの設計に固執したいので:次のようなシリーズテーブルがあると仮定します:

create table series_a (
  season_num,         
  i_have_season, 
  episodes, 
  episodes_i_have
);

create table series_b (
  season_num,         
  i_have_season, 
  episodes, 
  episodes_i_have
);

など、および次のような要約テーブル:

create table summary (
  series_name,
  alt_name,
  special_eps,
  special_eps_me,
  tot_ses,
  tot_ses_me,
  tot_episodes,
  tot_episodes_me,
  primary key(series_name));

シリーズ テーブルごとに 3 つのトリガー (挿入、更新、削除) を作成する必要があります。

  create trigger series_a_ins after insert on series_a 
  begin
    update summary set tot_ses = (select count(*) from series_a ),
                       tot_ses_me = (select count(*) from series_a  where  i_have_season = 'T'),
                       tot_episodes = (select sum(episodes) from series_a ),
                       tot_episodes_me = (select sum(episodes_i_have) from series_a where  i_have_season = 'T') 
    where series_name = 'a';
  end;

/* create trigger series_a_upd after update on series_a ... */
/* create trigger series_a_del after delete on series_a ... */

このバージョンでは、集計エントリを集計テーブルに手動で追加する必要があり、後で series_... テーブルを変更すると、カウンターが自動的に更新されます。

INSERT OR REPLACE (ドキュメントを参照) を使用して、必要に応じて要約エントリを作成することもできます。

于 2013-10-27T13:55:53.770 に答える