如何创建自动更新sqlite表?

时间:2013-10-27 11:17:28

标签: python sql database sqlite

我正在使用python脚本为动漫节目创建和维护一个sqlite数据库,我希望能帮助我更好地跟踪它们以及我需要获得的剧集。

我使用脚本为每个系列创建一个表格,例如Bleach,Black Lagoon ......并在每个表格中存储以下信息:

系列表:

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

我为每个系列创建了相同的表格,并且该系列中每个季节的一行似乎都能正常工作。

现在我要做的是创建一个汇总表,该汇总表从每个系列的表中获取信息,并创建一个表,其中包含我需要的所有信息,它具有以下信息:

汇总表:

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

我认为我想要做的事情可以使用触发器来完成,但我不确定如何实现它们,以便如果例如将新季节添加到系列表或系列表的值中,则汇总表将自动更新改变了。

更新

Fabian想要一个视图而不是一个桌子,经过更多的研究和研究听起来可能是我想要的但是如果有可能的话我希望将每个系列分别保留在自己的表中进行更新而不是只有1个表每个系列赛和每个赛季都融为一体。

更新2:

我已经完成了INSERT,UPDATE和DELETE的触发器,我在脚本的初始创建循环中添加了它们,使用表名的变量,并且汇总表似乎正在更新(在修复了一些之后)其中的值被计算出来)。我会进一步测试它,希望它会继续工作。现在我只需要让我的脚本为新系列和我删除的系列添加和删除表。

1 个答案:

答案 0 :(得分: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));

您必须为每个系列表创建三个触发器(插入,更新,删除),例如:

  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 ... */

使用此版本,您必须在摘要表中手动添加摘要条目,然后在修改系列_...表时,计数器会自动更新。

您也可以使用INSERT OR REPLACE(see documentation)按需创建摘要条目。