From f5c4671bfbad96bf346bd7e9a21fc4317b4959df Mon Sep 17 00:00:00 2001 From: Indrajith K L Date: Sat, 3 Dec 2022 17:00:20 +0530 Subject: Adds most of the tools --- v_windows/v/examples/database/mysql.v | 17 ++ v_windows/v/examples/database/orm.v | 257 ++++++++++++++++++++++++++ v_windows/v/examples/database/psql/.gitignore | 1 + v_windows/v/examples/database/psql/customer.v | 63 +++++++ v_windows/v/examples/database/psql/mydb.sql | 122 ++++++++++++ v_windows/v/examples/database/sqlite.v | 22 +++ 6 files changed, 482 insertions(+) create mode 100644 v_windows/v/examples/database/mysql.v create mode 100644 v_windows/v/examples/database/orm.v create mode 100644 v_windows/v/examples/database/psql/.gitignore create mode 100644 v_windows/v/examples/database/psql/customer.v create mode 100644 v_windows/v/examples/database/psql/mydb.sql create mode 100644 v_windows/v/examples/database/sqlite.v (limited to 'v_windows/v/examples/database') 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) + } +} -- cgit v1.2.3