# Mac
$ brew install sqlite
# Linux
$ sudo apt-get install sqlite libsqlite3-dev
-- inicia o SQLite no terminal e armazena tudo num arquivo db.sqlite
$ sqlite3 db.sqlite
---------------------------------------------------------------------
CREATE TABLE 'cart' (
id INTEGER PRIMARY KEY AUTOINCREMENT,
owner VARCHAR,
total FLOAT
);
CREATE TABLE 'product' (
id INTEGER PRIMARY KEY AUTOINCREMENT,
desc VARCHAR,
price FLOAT
);
CREATE TABLE 'cart_item' (
id INTEGER PRIMARY KEY AUTOINCREMENT,
cart_id INTEGER FOREING KEY REFERENCES cart(id),
product_id INTEGER FOREING KEY REFERENCES product(id),
qty INTEGER
);
INSERT INTO 'cart' (owner) VALUES ('Jon Snow');
INSERT INTO 'cart' (owner) VALUES ('Cersei');
INSERT INTO 'product' (desc, price) VALUES ('dragon glass', 20.0);
INSERT INTO 'product' (desc, price) VALUES ('elephants', 250.30);
INSERT INTO 'product' (desc, price) VALUES ('wine', 0.50);
INSERT INTO 'cart_item' (cart_id, product_id, qty) VALUES (1, 1, 100);
INSERT INTO 'cart_item' (cart_id, product_id, qty) VALUES (2, 2, 20);
INSERT INTO 'cart_item' (cart_id, product_id, qty) VALUES (1, 3, 200);
INSERT INTO 'cart_item' (cart_id, product_id, qty) VALUES (2, 3, 700);
-- for better visualization
.headers on
.mode column
SELECT * FROM 'cart'; -- seleciona tudo da tabela 'cart'
SELECT * FROM 'product'; -- seleciona tudo da tabela 'product'
-- Pega o nome do owner (em cart),
-- o nome do produto e o preço (em product)
-- e a quantidade de cada item (em cart_item)
SELECT cart.owner, product.desc, product.price, cart_item.qty FROM 'cart_item'
JOIN 'product' ON product.id = cart_item.product_id
JOIN 'cart' ON cart.id = cart_item.cart_id
WHERE cart.id = 1;
UPDATE 'product' SET price = 1 WHERE desc = 'wine';
UPDATE 'cart' SET owner = 'Tyrion' WHERE id = 1;
UPDATE 'cart_item' SET cart_id = 1 WHERE product_id = 3;
UPDATE 'product' SET price = 1000; -- Oh oh...DELETE FROM 'product' WHERE desc = 'elephants';
DELETE FROM 'cart' WHERE id = 2;
UPDATE 'cart_item'; -- Oh oh...# cada tabela de nosso BD será uma Classe em ruby. Exemplo
# lib/models/cart.rb
class Cart
attr_reader :id, :total
attr_accessor :owner
def initialize(attributes = {})
@id = attributes[:id]
@owner = attributes[:owner]
@total = attributes[:total]
end
end# lib/app.rb
require 'sqlite3' # precisamos disso para usar os comandos SQLite
# vamos importar os arquivos de nossas classes para usarmos aqui
require_relative 'models/cart'
require_relative 'models/product'
require_relative 'models/cart_item'
# inicializamos a constante que irá referenciar nosso BD
# passando o caminho do arquivo onde o mesmo se encontra (relativo
# ao arquivo app.rb
db_path = File.join(File.dirname(__FILE__), "db/shopping.sqlite")
DB = SQLite3::Database.new(db_path)
# Podemos realizar várias consultas dessa maneira
DB.execute("INSERT INTO 'cart' (owner) VALUES ('Cersei')")
# Se tivermos um modelo...
cart = Cart.new(owner: 'Jon Snow')
# ...Podemos interpolá-lo!
DB.execute("INSERT INTO 'cart' (owner) VALUES ('#{cart.owner}')")# lib/app.rb
# ...
rows = DB.execute("SELECT desc, price FROM product")
# => [
# ["dragon glass", 20.0],
# ["elephants", 250.3],
# ["wine", 0.5]
# ]
# Se quisermos mostrar os resultados em hashes
DB.results_as_hash = true
rows = DB.execute("SELECT desc, price FROM product")
# => [
# {"desc"=>"dragon glass", "price"=>20.0},
# {"desc"=>"elephants", "price"=>250.3},
# {"desc"=>"wine", "price"=>0.5}
# ]