Addons/data/sqlite/Basic Usage

From J Wiki
Jump to navigation Jump to search
Overview | Basic Usage | Create | Definitions | zFns | Installation | Nulls | Examples | Quirks

Overview

The addon is read into locale psqlite. A sqlite database is opened or created in an instance of this locale, and subsequent access uses this instance.

For example, using the sandp database included with the addon:

   load 'data/sqlite'
   db=: sqlopen_psqlite_ '~addons/data/sqlite/db/sandp.db'

Meta Data

Tables in database:

   sqltables__db''
β”Œβ”€β”¬β”€β”¬β”€β”€β”
β”‚pβ”‚sβ”‚spβ”‚
β””β”€β”΄β”€β”΄β”€β”€β”˜

Table description:

   sqlmeta__db 's'
β”Œβ”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”
β”‚cidβ”‚name  β”‚typeβ”‚notnullβ”‚dflt_valueβ”‚pkβ”‚
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€
β”‚0  β”‚sid   β”‚textβ”‚0      β”‚          β”‚1 β”‚
β”‚1  β”‚name  β”‚textβ”‚0      β”‚          β”‚0 β”‚
β”‚2  β”‚statusβ”‚int β”‚0      β”‚          β”‚0 β”‚
β”‚3  β”‚city  β”‚textβ”‚0      β”‚          β”‚0 β”‚
β””β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”˜

Reading Data

The main function is sqlread which returns a pair: column names, list of column_values. There are several other reading functions that call sqlread under the covers.

   sqlread__db 'select * from s'
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€..
β”‚β”Œβ”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”β”‚β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€..
β”‚β”‚sidβ”‚nameβ”‚statusβ”‚cityβ”‚β”‚β”‚β”Œβ”€β”€β”¬β”€β”€β”¬β”€β”€β”¬β”€β”€β”¬β”€β”€β”β”‚β”Œβ”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”β”‚20 10 30 20 ..
β”‚β””β”€β”€β”€β”΄β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”˜β”‚β”‚β”‚s1β”‚s2β”‚s3β”‚s4β”‚s5β”‚β”‚β”‚smithβ”‚jonesβ”‚blakeβ”‚clarkβ”‚adamsβ”‚β”‚            ..
β”‚                      β”‚β”‚β””β”€β”€β”΄β”€β”€β”΄β”€β”€β”΄β”€β”€β”΄β”€β”€β”˜β”‚β””β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”˜β”‚            ..
β”‚                      │└────────────────┴───────────────────────────────┴────────────..
└──────────────────────┴──────────────────────────────────────────────────────────────..

For interactive use, the function sqlreads is a cover for sqlread that returns a formatted display:

   sqlreads__db 'select * from s'
β”Œβ”€β”€β”€β”¬β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”
β”‚sidβ”‚name β”‚statusβ”‚city  β”‚
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€
β”‚s1 β”‚smithβ”‚20    β”‚londonβ”‚
β”‚s2 β”‚jonesβ”‚10    β”‚paris β”‚
β”‚s3 β”‚blakeβ”‚30    β”‚paris β”‚
β”‚s4 β”‚clarkβ”‚20    β”‚londonβ”‚
β”‚s5 β”‚adamsβ”‚30    β”‚athensβ”‚
β””β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”˜

For convenience, the select keyword and * column specifier can be omitted:

  sqlreads__db 's'
β”Œβ”€β”€β”€β”¬β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”
β”‚sidβ”‚name β”‚statusβ”‚city  β”‚
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€
β”‚s1 β”‚smithβ”‚20    β”‚londonβ”‚
β”‚s2 β”‚jonesβ”‚10    β”‚paris β”‚
β”‚s3 β”‚blakeβ”‚30    β”‚paris β”‚
β”‚s4 β”‚clarkβ”‚20    β”‚londonβ”‚
β”‚s5 β”‚adamsβ”‚30    β”‚athensβ”‚
β””β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”˜

Otherwise, the argument is a standard SQL statement (as supported by sqlite):

  sqlreads__db 's where status=30 order by city'
β”Œβ”€β”€β”€β”¬β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”
β”‚sidβ”‚name β”‚statusβ”‚city  β”‚
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€
β”‚s5 β”‚adamsβ”‚30    β”‚athensβ”‚
β”‚s3 β”‚blakeβ”‚30    β”‚paris β”‚
β””β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”˜
   sqlreads__db 'sid,sum(qty),max(qty) from sp group by sid'
β”Œβ”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚sidβ”‚sum(qty)β”‚max(qty)β”‚
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚s1 β”‚1200    β”‚400     β”‚
β”‚s2 β”‚ 700    β”‚400     β”‚
β”‚s3 β”‚ 200    β”‚200     β”‚
β”‚s4 β”‚1000    β”‚400     β”‚
β””β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Writing Data

The sqlinsert function takes an argument of a table, followed by a pair: column_names, column_values (the same format as the result of sqlread). For example, using a copy of the sandp database:

   db=: sqlcopy_psqlite_ '~addons/data/sqlite/db/sandp.db';'~temp/sandp.db'

   cls=: ;:'sid name status city'
   dat=: ('s6';'s7');('brown';'eaton');40 10;<'rome';'madrid'
   sqlinsert__db 's';cls;<dat

   5 sqltail__db 's'         NB. last 5 records
β”Œβ”€β”€β”€β”¬β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”
β”‚sidβ”‚name β”‚statusβ”‚city  β”‚
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€
β”‚s3 β”‚blakeβ”‚30    β”‚paris β”‚
β”‚s4 β”‚clarkβ”‚20    β”‚londonβ”‚
β”‚s5 β”‚adamsβ”‚30    β”‚athensβ”‚
β”‚s6 β”‚brownβ”‚40    β”‚rome  β”‚
β”‚s7 β”‚eatonβ”‚10    β”‚madridβ”‚
β””β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”˜

The sqlupdate function (v1.0.23 and later) updates records on a where statement:

   sqlupdate__db 'p';'weight=12';('name';'city');<'hammer';'vienna'
   sqlhead__db 'p where weight=12'
β”Œβ”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”
β”‚pidβ”‚name  β”‚colorβ”‚weightβ”‚city  β”‚
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€
β”‚p1 β”‚hammerβ”‚red  β”‚12    β”‚viennaβ”‚
β”‚p5 β”‚hammerβ”‚blue β”‚12    β”‚viennaβ”‚
β””β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”˜

Example for update only one field:

   sqlupdate__db 'p';'weight=12';(,<'name');<,<'hammer'

The sqlupsert function is a variant that will update existing records on given keys, and insert any remaining records:

   dat=: ('s5';'s8');('adams';'scott');50 60;<'lisbon';'berlin'
   sqlupsert__db 's';'sid';cls;<dat

   5 sqltail__db 's'
β”Œβ”€β”€β”€β”¬β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”
β”‚sidβ”‚name β”‚statusβ”‚city  β”‚
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€
β”‚s4 β”‚clarkβ”‚20    β”‚londonβ”‚
β”‚s5 β”‚adamsβ”‚50    β”‚lisbonβ”‚
β”‚s6 β”‚brownβ”‚40    β”‚rome  β”‚
β”‚s7 β”‚eatonβ”‚10    β”‚madridβ”‚
β”‚s8 β”‚scottβ”‚60    β”‚berlinβ”‚
β””β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”˜