SQLAlchemy タグの一覧です(1 件)

[Flask][SQLAlchemy]ブログのタグ付けされた件数を取得する

このブログは下記のようなmany to many relationshipで構成されているのですが、タグに紐ついたエントリー件数をサイトバーのタグ一覧に表示させるというタスクをようやくやっつけたのでメモっておきます(Python2.7.3で確認しています)

$ sqlite3 -header flasklog/flasklog.db ".schema"
CREATE TABLE entries (
        id INTEGER NOT NULL,
        title VARCHAR(60),
        text VARCHAR,
        pub_date DATETIME,
        PRIMARY KEY (id)
);
CREATE TABLE entry_tags (
        tag_id INTEGER,
        entry_id INTEGER,
        FOREIGN KEY(tag_id) REFERENCES tags (id),
        FOREIGN KEY(entry_id) REFERENCES entries (id)
);
CREATE TABLE tags (
        id INTEGER NOT NULL,
        name VARCHAR,
        PRIMARY KEY (id)
);

ここらへんを参考にpython - SQLAlchemy ordering by count on a many to many relationship - Stack Overflow:

In [26]: from flasklog.models import Base, Entry, Tag, entry_tags

In [27]: from flasklog.database import db_session

In [28]: from sqlalchemy.sql import functions as func

In [29]: db_session.query(Tag, func.count(entry_tags.c.tag_id).label('total')).join(entry_tags).group_by(Tag).order_by('total DESC').all()
2013-07-28 20:48:51,083 INFO sqlalchemy.engine.base.Engine SELECT tags.id AS tags_id, tags.name AS tags_name, count(entry_tags.tag_id) AS total
FROM tags JOIN entry_tags ON tags.id = entry_tags.tag_id GROUP BY tags.id, tags.name ORDER BY total DESC
2013-07-28 20:48:51,083 INFO sqlalchemy.engine.base.Engine ()
Out[29]:
[(Tag(2, u'Python'), 19),
 (Tag(15, u'Flask'), 10),
 (Tag(6, u'Life'), 6),
 (Tag(5, u'Twitter'), 4),
 (Tag(41, u'Bottle'), 3),
 (Tag(1, u'blogmop'), 2),
 (Tag(3, u'Linode'), 2),
 (Tag(4, u'CentOS'), 2),
 (Tag(7, u'foursquare'), 2),
 (Tag(9, u'iPhone'), 2),
 (Tag(14, u'Shizuoka'), 2),
 (Tag(27, u'Google'), 2),
 (Tag(30, u'Ubuntu'), 2),
 (Tag(32, u'Alfred'), 2),
 (Tag(39, u'Shizuokapy'), 2),
 (Tag(8, u'AppleScript'), 1),
 (Tag(10, u'Dropbox'), 1),
 (Tag(11, u'OSX'), 1),
 (Tag(12, u'vim'), 1),
 (Tag(13, u'VPS'), 1),
 (Tag(17, u'DISQUS'), 1),
 (Tag(18, u'Atelier SANGO'), 1),
 (Tag(19, u'Git'), 1),
 (Tag(20, u'Dashboard'), 1),
 (Tag(21, u'Werkzeug'), 1),
 (Tag(22, u'iTunes'), 1),
 (Tag(23, u'iOS5'), 1),
 (Tag(24, u'Gmail'), 1),
 (Tag(25, u'hatena'), 1),
 (Tag(26, u'Chrome'), 1),
 (Tag(28, u'iPad'), 1),
 (Tag(29, u'Flipboard'), 1),
 (Tag(31, u'CotEditor'), 1),
 (Tag(33, u'Evernote'), 1),
 (Tag(34, u'Logwatch'), 1),
 (Tag(35, u'feedparser'), 1),
 (Tag(36, u'BeautifulSoup'), 1),
 (Tag(37, u'javascript'), 1),
 (Tag(38, u'bookmarklet'), 1),
 (Tag(40, u'virtualenv'), 1),
 (Tag(42, u'Bitbucket'), 1),
 (Tag(43, u'Jinja2'), 1),
 (Tag(44, u'SQLAlchemy'), 1)]

こんな感じで取得出来たので、あとはtemplateに展開していくだけですね

とりあえずわかったことは

  • sqliteはワンライナーで使う方が便利だと思った。zshの履歴に記憶されるし、パイプも使える。
  • 一般的なrelationshipなSQLAlchemyならばStack Overflowをチェックしていればある程度は解決できると再認識した。

PAGE TOP