aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/examples/database
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/examples/database')
-rw-r--r--v_windows/v/examples/database/mysql.v17
-rw-r--r--v_windows/v/examples/database/orm.v257
-rw-r--r--v_windows/v/examples/database/psql/.gitignore1
-rw-r--r--v_windows/v/examples/database/psql/customer.v63
-rw-r--r--v_windows/v/examples/database/psql/mydb.sql122
-rw-r--r--v_windows/v/examples/database/sqlite.v22
6 files changed, 482 insertions, 0 deletions
diff --git a/v_windows/v/examples/database/mysql.v b/v_windows/v/examples/database/mysql.v
new file mode 100644
index 0000000..97e0888
--- /dev/null
+++ b/v_windows/v/examples/database/mysql.v
@@ -0,0 +1,17 @@
+import mysql
+
+fn main() {
+ mut conn := mysql.Connection{
+ host: 'localhost'
+ port: 3306
+ username: 'root'
+ password: ''
+ dbname: 'mysql'
+ }
+ conn.connect() ?
+ res := conn.query('show tables') ?
+ for row in res.rows() {
+ println(row.vals.join(', '))
+ }
+ conn.close()
+}
diff --git a/v_windows/v/examples/database/orm.v b/v_windows/v/examples/database/orm.v
new file mode 100644
index 0000000..b308e91
--- /dev/null
+++ b/v_windows/v/examples/database/orm.v
@@ -0,0 +1,257 @@
+import sqlite
+import mysql
+import pg
+
+[table: 'modules']
+struct Module {
+ id int [primary; sql: serial]
+ name string
+ nr_downloads int [sql: u64]
+ creator User
+}
+
+struct User {
+ id int [primary; sql: serial]
+ age int [unique: 'user']
+ name string [sql: 'username'; unique]
+ is_customer bool [sql: 'abc'; unique: 'user']
+ skipped_string string [skip]
+}
+
+struct Parent {
+ id int [primary; sql: serial]
+ name string
+ children []Child [fkey: 'parent_id']
+}
+
+struct Child {
+ id int [primary; sql: serial]
+ parent_id int
+ name string
+}
+
+fn main() {
+ sqlite3_array()
+ mysql_array()
+ psql_array()
+
+ sqlite3()
+ mysql()
+ psql()
+}
+
+fn sqlite3_array() {
+ mut db := sqlite.connect(':memory:') or { panic(err) }
+ sql db {
+ create table Parent
+ }
+
+ par := Parent{
+ name: 'test'
+ children: [
+ Child{
+ name: 'abc'
+ },
+ Child{
+ name: 'def'
+ },
+ ]
+ }
+
+ sql db {
+ insert par into Parent
+ }
+
+ parent := sql db {
+ select from Parent where id == 1
+ }
+
+ sql db {
+ drop table Parent
+ }
+
+ eprintln(parent)
+}
+
+fn mysql_array() {
+ mut db := mysql.Connection{
+ host: 'localhost'
+ port: 3306
+ username: 'root'
+ password: 'abc'
+ dbname: 'test'
+ }
+ db.connect() or { panic(err) }
+
+ sql db {
+ create table Parent
+ }
+
+ par := Parent{
+ name: 'test'
+ children: [
+ Child{
+ name: 'abc'
+ },
+ Child{
+ name: 'def'
+ },
+ ]
+ }
+
+ sql db {
+ insert par into Parent
+ }
+
+ parent := sql db {
+ select from Parent where id == 1
+ }
+
+ eprintln(parent)
+
+ sql db {
+ drop table Parent
+ }
+
+ db.close()
+}
+
+fn psql_array() {
+ mut db := pg.connect(host: 'localhost', user: 'test', password: 'abc', dbname: 'test') or {
+ panic(err)
+ }
+
+ sql db {
+ create table Parent
+ }
+
+ par := Parent{
+ name: 'test'
+ children: [
+ Child{
+ name: 'abc'
+ },
+ Child{
+ name: 'def'
+ },
+ ]
+ }
+
+ sql db {
+ insert par into Parent
+ }
+
+ parent := sql db {
+ select from Parent where id == 1
+ }
+
+ eprintln(parent)
+
+ sql db {
+ drop table Parent
+ }
+
+ db.close()
+}
+
+fn sqlite3() {
+ mut db := sqlite.connect(':memory:') or { panic(err) }
+ sql db {
+ create table Module
+ }
+
+ mod := Module{
+ name: 'test'
+ nr_downloads: 10
+ creator: User{
+ age: 21
+ name: 'VUser'
+ is_customer: true
+ }
+ }
+ sql db {
+ insert mod into Module
+ }
+
+ modul := sql db {
+ select from Module where id == 1
+ }
+
+ sql db {
+ drop table Module
+ }
+
+ eprintln(modul)
+ db.close() or { panic(err) }
+}
+
+fn mysql() {
+ mut conn := mysql.Connection{
+ host: 'localhost'
+ port: 3306
+ username: 'root'
+ password: 'abc'
+ dbname: 'test'
+ }
+ conn.connect() or { panic(err) }
+
+ sql conn {
+ create table Module
+ }
+
+ mod := Module{
+ name: 'test'
+ nr_downloads: 10
+ creator: User{
+ age: 21
+ name: 'VUser'
+ is_customer: true
+ }
+ }
+
+ sql conn {
+ insert mod into Module
+ }
+
+ m := sql conn {
+ select from Module where id == 1
+ }
+
+ eprintln(m)
+ conn.close()
+}
+
+fn psql() {
+ mut db := pg.connect(host: 'localhost', user: 'test', password: 'abc', dbname: 'test') or {
+ panic(err)
+ }
+
+ mod := Module{
+ name: 'test'
+ nr_downloads: 10
+ creator: User{
+ age: 21
+ name: 'VUser'
+ is_customer: true
+ }
+ }
+
+ sql db {
+ create table Module
+ }
+
+ sql db {
+ insert mod into Module
+ }
+
+ modul := sql db {
+ select from Module where id == 1
+ }
+
+ sql db {
+ drop table Module
+ }
+
+ eprintln(modul)
+ db.close()
+}
diff --git a/v_windows/v/examples/database/psql/.gitignore b/v_windows/v/examples/database/psql/.gitignore
new file mode 100644
index 0000000..23830aa
--- /dev/null
+++ b/v_windows/v/examples/database/psql/.gitignore
@@ -0,0 +1 @@
+customer
diff --git a/v_windows/v/examples/database/psql/customer.v b/v_windows/v/examples/database/psql/customer.v
new file mode 100644
index 0000000..4538a94
--- /dev/null
+++ b/v_windows/v/examples/database/psql/customer.v
@@ -0,0 +1,63 @@
+module main
+
+import pg
+
+const dash = '----------------------------------------------------------------'
+
+struct Customer {
+ id int
+ name string
+ nr_orders int
+ country string
+}
+
+fn main() {
+ /*
+ db := pg.connect(pg.Config{
+ host: 'localhost' //'127.0.0.1'
+ user: 'postgres'
+ dbname: 'customerdb'
+ }) or {
+ println('failed to connect')
+ println(err)
+ return
+ }
+
+ nr_customers := db.select count from Customer
+ println('Total customers: $nr_customers')
+
+ // V syntax can be used to build queries
+ println(dash)
+ bg_country := 'Bulgaria'
+ bg_customers := db.select from Customer where country == bg_country && id != 2
+ for customer in bg_customers {
+ println('$customer.country | $customer.id - $customer.name')
+ }
+
+ println(dash)
+ ru_customers := db.select from Customer where country == 'Russia'
+ for customer in ru_customers {
+ println('$customer.country | $customer.id - $customer.name')
+ }
+
+ // by adding `limit 1` we tell V that there will be only one object
+ println(dash)
+ existing := db.select from Customer where id == 1 limit 1 or { panic(err) }
+ println('Existing customer name: $existing.name')
+ println('Existing customer full information:')
+ println(existing)
+
+ println(dash)
+ q := Customer{}
+ // It's easy to handle queries that don't return any data
+ if anon := db.select from Customer where id == 12345 && name == q.name &&
+ nr_orders > q.nr_orders limit 1 {
+ println('Non existing customer name: $anon.name')
+ }
+ // Insert a new customer
+ nc := Customer{
+ name: 'John Doe'
+ nr_orders: 10
+ }
+ db.insert(nc)*/
+}
diff --git a/v_windows/v/examples/database/psql/mydb.sql b/v_windows/v/examples/database/psql/mydb.sql
new file mode 100644
index 0000000..a7cbb39
--- /dev/null
+++ b/v_windows/v/examples/database/psql/mydb.sql
@@ -0,0 +1,122 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 9.5.19
+-- Dumped by pg_dump version 9.5.19
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner:
+--
+
+CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
+
+
+--
+-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner:
+--
+
+COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
+
+
+SET default_tablespace = '';
+
+SET default_with_oids = false;
+
+--
+-- Name: customers; Type: TABLE; Schema: public; Owner: myuser
+--
+
+CREATE TABLE public.customers (
+ id integer NOT NULL,
+ name text DEFAULT ''::text,
+ nr_orders integer DEFAULT 0,
+ country text DEFAULT 'England'::text,
+ created_at timestamp without time zone DEFAULT now()
+);
+
+
+ALTER TABLE public.customers OWNER TO myuser;
+
+--
+-- Name: customers_id_seq; Type: SEQUENCE; Schema: public; Owner: myuser
+--
+
+CREATE SEQUENCE public.customers_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE public.customers_id_seq OWNER TO myuser;
+
+--
+-- Name: customers_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: myuser
+--
+
+ALTER SEQUENCE public.customers_id_seq OWNED BY public.customers.id;
+
+
+--
+-- Name: id; Type: DEFAULT; Schema: public; Owner: myuser
+--
+
+ALTER TABLE ONLY public.customers ALTER COLUMN id SET DEFAULT nextval('public.customers_id_seq'::regclass);
+
+
+--
+-- Data for Name: customers; Type: TABLE DATA; Schema: public; Owner: myuser
+--
+
+COPY public.customers (id, name, nr_orders, country, created_at) FROM stdin;
+2 Pippi Långstrump 3 Bulgaria 2019-08-19 09:41:30.78888
+1 Bilbo Begins 11 Bulgaria 2019-08-19 09:40:31.396807
+3 Viktualia Rullgardina 0 Bulgaria 2019-08-19 09:42:52.723223
+4 Krusmynta Efraimsdotter 5 Bulgaria 2019-08-19 09:43:04.083209
+5 Ana Karenina 0 Russia 2019-08-20 15:41:50.244971
+7 Jiji Lolobridgida 0 Italy 2019-08-20 15:42:26.020113
+6 Viktor Savashkin 8 Russia 2019-08-20 15:42:07.213557
+\.
+
+
+--
+-- Name: customers_id_seq; Type: SEQUENCE SET; Schema: public; Owner: myuser
+--
+
+SELECT pg_catalog.setval('public.customers_id_seq', 1, true);
+
+
+--
+-- Name: customers_pkey; Type: CONSTRAINT; Schema: public; Owner: myuser
+--
+
+ALTER TABLE ONLY public.customers
+ ADD CONSTRAINT customers_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: SCHEMA public; Type: ACL; Schema: -; Owner: postgres
+--
+
+REVOKE ALL ON SCHEMA public FROM PUBLIC;
+REVOKE ALL ON SCHEMA public FROM postgres;
+GRANT ALL ON SCHEMA public TO postgres;
+GRANT ALL ON SCHEMA public TO PUBLIC;
+
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/v_windows/v/examples/database/sqlite.v b/v_windows/v/examples/database/sqlite.v
new file mode 100644
index 0000000..a3c7176
--- /dev/null
+++ b/v_windows/v/examples/database/sqlite.v
@@ -0,0 +1,22 @@
+import sqlite
+
+fn main() {
+ db := sqlite.connect(':memory:') ?
+ db.exec("create table users (id integer primary key, name text default '');")
+
+ db.exec("insert into users (name) values ('Sam')")
+ db.exec("insert into users (name) values ('Peter')")
+ db.exec("insert into users (name) values ('Kate')")
+
+ nr_users := db.q_int('select count(*) from users')
+ println('nr users = $nr_users')
+
+ name := db.q_string('select name from users where id = 1')
+ assert name == 'Sam'
+
+ users, code := db.exec('select * from users')
+ println('SQL Result code: $code')
+ for row in users {
+ println(row.vals)
+ }
+}