Raku Land

Slang::SQL

Slang::SQL

Quick little SQL SLang for perl6 to embed SQL into the language. Design goals were:

What it doesn't do [yet]

Use

use Slang::SQL; use DBIish; my $*DB = DBIish.connect('SQLite', :database<sqlite.sqlite3>); sql drop table if exists stuff; #runs 'drop table if exists stuff'; sql create table if not exists stuff ( id integer, sid varchar(32) ); for ^5 { sql insert into stuff (id, sid) values (?, ?); with ($_, ('A'..'Z').pick(16).join); } sql select * from stuff order by id asc; do -> $row { FIRST "{$*STATEMENT}id\tsid".say; "{$row<id>}\t{$row<sid>}".say; };

Output:

select * from stuff order by id asc
id      sid
0       WSNPLYBHJRMVXKFQ
1       UYNZMXFSABRCOLKP
2       MIQVEDTNXBWGHZFL
3       KFNJWXLSRQEUGBZA
4       VDOMIUYCWQZHGRPF

Equivalent Code Slang vs. Only DBIish

Example Above

Slang::SQL

use Slang::SQL; use DBIish; my $*DB = DBIish.connect('SQLite', :database<sqlite.sqlite3>); sql drop table if exists stuff; #runs 'drop table if exists stuff'; sql create table if not exists stuff ( id integer, sid varchar(32) ); for ^5 { sql insert into stuff (id, sid) values (?, ?); with ($_, ('A'..'Z').pick(16).join); } sql select * from stuff order by id asc; do -> $row { FIRST "{$*STATEMENT}id\tsid".say; "{$row<id>}\t{$row<sid>}".say; };

DBIish

use DBIish; my $db = DBIish.connect('SQLite', :database<sqlite.sqlite3>); $db.do('drop table if exists stuff;'); $db.do('create table if not exists stuff ( id integer, sid varchar(32) )'); for ^5 { $db.do('insert into stuff (id, sid) values(?,?);', ($_, ('A'..'Z').pick(16).join)); } my $sql = 'select * from stuff order by id asc'; my $stmt = $db.prepare($sql); $stmt.execute(); while (my $row = $stmt.row(:hash)) { FIRST "{$sql}id\tsid".say; "{$row<id>}\t{$row<sid>}".say; } $stmt.finish;

Nested SQL

Slang::SQL

use Slang::SQL; use DBIish; my $*DB = DBIish.connect('SQLite', :database<sqlite.sqlite3>); sql select * from stuff order by id asc; do -> $row1 { sql select * from stuff where id > ?; with ($row1<id>) do -> $row2 { #do something with $row1 or $row2! }; };

DBIish

use DBIish; my $db = DBIish.connect('SQLite', :database<sqlite.sqlite3>); my $sql1 = 'select * from stuff order by id asc'; my $sql2 = 'select * from stuff where id > ?'; my $stm1 = $db.prepare($sql1); my $stm2 = $db.prepare($sql2); $stm1.execute(); while (my $row1 = $stm1.row(:hash)) { $stm2.execute($row1<id>); while (my $row2 = $stm2.row(:hash)) { #do something here } }

Mo Better Examples

Check out t/01_basic.t