https://metacpan.org/module/SQL::Translator::Producer::Teng TengのSchemaは手で書くのがタルいので、Teng::Schema::DumperなりTeng::Schema::Loaderなりを使ってごにょったりしていたのですが、無理やりだし、自動生成すればいいよねとは思っていたので、書きました。 Kyoto.pmでも先日のYAPC::Asiaでも「SQL::Translator::Producer::Tengみたいなのがあればいいかもしれないけど特に不便を感じてないからやってない」とか言っていたのですが、書いてみたら案外サクッとかけたので、CPANizeした次第。 以下の様なSQLファイルがあったとして、 CREATE TABLE `user` ( `id` BIGINT PRIMARY KEY AUTO_INCREMENT
今回は Perl の O/Rマッパー Teng を触ってみます。特に触れない限りMySQLを利用しているということにして、コードのサンプルは DB名 teng_test / 利用するテーブルは users / そのテーブルレイアウトは mysql> SHOW FIELDS FROM users; +---------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_
2013年08月01日09:54 カテゴリprogramming PerlのO/Rマッパ、 Teng の便利な使い方のご紹介 こんにちは、Research Panel Asiaの大山です。 今回は、Perlで最近ホットなO/Rマッパ、 Teng の便利な使い方を共有いたします。 みなさんは、 sqlite> .tables user_log_2013_03 user_log_2013_04 user_log_2013_05 user_log_2013_06 user_log_2013_07 user_log_2013_08 こんな要領で、定期的にDBにテーブルが作られていくような仕組みを見たことはあるのでしょうか。 最近のMySQLでは著しくパーティショニング機能が改善されていますが、少し前のバージョンを使用していると 制約と制限 の都合で選びにくかったり、テーブルが巨大になるとスキーマの
https://metacpan.org/module/Teng::Plugin::SearchJoined https://metacpan.org/module/SQL::Maker::Plugin::JoinSelect N+1問題という近年まことしやかに語られるようになった言葉があります。当たり前の事象に大げさに名前をつけるのどうなのかと思ったりもするわけですが、名前が付いていると案外説明に便利だったりして「名前重要」だなーとか思ったり思わなかったりするわけです。 最近はTengを便利に使わせてもらっているわけですが、Tengはシンプルな分、何も考えないで使うとN+1問題が多発してしまいます。そう言う思想なわけです。 クエリ数を抑えるためにJOINしたクエリを投げたくなるわけですが、そうなると自分で投げるしか無くて、それはまだいいとしても、普段Rowオブジェクトを使い慣れているゆる
背景としては、私自身がTengのメンテナスに時間を割くことができず、利用者からの要望に答えることが難しくなってしまった為です。 せっかくpull-requestを送ってもらっても気づくこともできず長期間放置してしまったり、 仕様に関する議論もしっかりできず、これでは死んだプロジェクトとなってしまうと思いました。 後任としては現在Tengを実際に利用しており、意欲的にpull-requestを送ってくれているcho45さんにお願いすることとなりました。 cho45さんであれば安心して後をお任せできると確信しております。 cho45体制のTengをこれからも応援よろしくお願い致します。 :D
昨日でTengを利用するのに必要なクラス定義は終了しているので早速 次のステップとして新しいレコードをデータベースに登録する INSERTの方法を紹介します。 insertメソッド SQLのINSERT文を実行するには以下のようにします。 my $row = $teng->insert('user', +{id => 1, name => 'nekokak'}); このようにすると、 INSERT INTO user (id,name) VALUES(1,'nekokak'); というようなSQLが実行され、データベースに新しい行が登録されます。 Tengのinsertメソッドの返り値として、insertしたtableに対応するRowクラスでインスタンス化された Rowオブジェクトがかえってきますので、 $row->id; # 1 $row->name; # nekokak といったように
Tengを使うにはまずSchemaの定義を行う必要があります。 なお、今回はProj::DBというnamespaceで統一して記述していきます。 コードは特記しない限りSQLiteを前提としています。 以下のようなテーブルがあるとし、 create table user ( id integer, name text, primary key ( id ) ); create table status ( id integer, user_id integer, body text, primary key ( id ) ); コレに対応するTengのSchemaは以下の様に書きます。 package Proj::DB::Schema; use strict; use warnings; use Teng::Schema::Declare; table { name 'user'; pk
こんにちは! 今年はボクが作ってるTengというPerlのORMについて 25日かけて紹介してみたいとおもてるんだ。 師走ってことで仕事もあっていろいろあって忙しいから完走できるかどうか不安なんだけど みんなに是非つかってもらいたいから頑張るんだ。 この記事執筆時点のTengの最新バージョンは0.14_03のdev releaseとなっています。 25日間でTengのバージョンがupされるかもしれませんがその場合は注意書きをいれますのでご注意ください。 Tengのリポジトリはhttps://github.com/nekokak/p5-TengこちらですのでCPANにupされる前に試したい! Tengにpatches and testsを叩きつけたい!という場合はforkしてpull requestしてくだされば よきにmergeしますよ。 Tengはなるべく依存モジュールが増えないようには
前回までの説明で、Teng を何となく使えるようになると思う。今回は Teng が提供する検索メソッドについて触れてなかった箇所についての説明をする。 Teng の検索メソッド 以下の4つのメソッドが提供されている。 Teng#search Teng#single Teng#search_named Teng#search_by_sql 上2つのメソッドは、Teng で CRUD をしてみる - amari3のはてなダイアリー で説明しているのでこちらを参照ください。 また、説明に使用するテーブルやスキーマ等は、こちら Teng でリレーションを使う方法 - amari3のはてなダイアリー と同じものです。 Teng#search_named メソッド Teng#search_named メソッドは生(に近い)SQL を記述する時に便利なメソッド。Teng::Iterator オブジェクト
前回は Teng でトランザクション処理をする方法を紹介しました。実際に色々試して、ブログに書くと頭にいい感じで入ってくるので続けていきたいです。今回は Teng でリレーションを使う方法を紹介していきます。 題材 説明に使用する題材は、掲示板へのエントリとそれに対するコメントの様なものを想定。 使用するテーブル 以下の2つのテーブルを使用します。 test@localhost:testdb> desc entry; +------------+------------------+------+-----+---------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+------------------+------+-----+---------
前回は、Teng で一通りの CRUD の仕方を紹介したんですが、トランザクション処理を考慮していなかったので、Teng でトランザクション処理をする方法を紹介します。 準備 テーブルは前回使用した memo テーブルを使います。 事前に以下の様なデータを入れておきました。 mysql> select * from memo order by id; +----+-------+---------+---------------------+---------------------+ | id | title | body | created_at | updated_at | +----+-------+---------+---------------------+---------------------+ | 1 | Hello | World | 2011-11-24 23:0
さて、掲示板をつくったとはいえ、これだけではおもしろくありませんね。 まずこの掲示板には重大な欠陥があります。具体的にいうと、ページングがされていません。 ウェブアプリケーションにおいてはページングは非常に重要な要素です。 なにかを一覧表示するページをつくるときに、ページングのことが思いうかばないようでは一人前のウェブエンジニアとはいえません。ページングを手抜きすると、あとあと重いページになって泣くことになるでしょう。ページングは最初の段階でいれておくのが結局は楽なのです(という自戒)。 さて、今回の掲示板では Teng をつかっているので非常にページャの実装が容易になっています。Teng ではページャ関連の実装はプラグインとなっていますから、Teng に Teng::Plugin::Pager をよみこませましょう。lib/MyBBS/DB.pm に以下のようにかきましょう。 packa
id:nekokak さんが開発されている、Teng で CRUD を一通りやってみました。 僕自身、DBIx::Class を以前使っていたんですが、あまりにも機能が富豪的すぎて使うのをやめてしまいました。それからは生 DBI を使っていたんですが、開発効率を考えたときに、ORM は使うべきだと再度考えるようになり、軽量な ORM、Teng に注目している所です。 準備 テスト用のテーブル +------------+-----------+------+-----+---------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +------------+-----------+------+-----+---------------------+-
DBの設定などはこちらに沿っています。 今回は、以下のコマンドでアプリケーションの雛形を作成した場合です。 $ amon2-setup.pl Hello config/development.plの編集 Teng用の設定を書いておきます。 +{ 'Teng' => { dsn => 'dbi:SQLite:dbname=hello.db', username => '', password => '', }, ... }; スキーマ作成スクリプト DBの情報を読み込んでスキーマを作成するスクリプトを書きます。 use strict; use warnings; use DBI; use FindBin; use File::Spec; use lib File::Spec->catdir($FindBin::Bin, '..', 'lib'); use lib File::Spec->ca
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く