# postgresqlと仲良くなりたい
CODEBASEプログラミングスクール資料
Postgresqlの簡単なコマンドとSinatraとの繋ぎかたを簡単に書いています。
# postgresql基本コマンド
### コマンドの種類
今回二種類のコマンドを使い分けるので、その見分けかたを記します。DB接続していない状態で打つコマンドか、接続後に打つコマンドかを分けてるだけです。
1. コマンドライン上でにコマンド(DB接続していない)
`$ コマンド`
2. DBに接続後のコマンド
`# コマンド`
<br>
### DB基本操作
version確認
```$ psql --version```
<br>
DBの一覧を見る
```$ psql -l```
<br>
DBを作る(二通り)
※ DBnameは自分が作りたいDBの名前を入れてください。
```
その1(terminal)
$ createdb DBname
その2(どこかのDBに入った後に)
# create database db_name;
```
※ PostgreSQLでDBを作る際、デフォルトで入ってるDBのtemplate1を複製しているらしいので、template1の設定を変更する= デフォルトの値の変更となる。
<br>
DBを消す
※ DBnameは自分が削除したいDBの名前を入れてください。
```$ dropdb DBname```
<br>
DBに入る
※ DBnameは自分が入りたいDBの名前を入れてください。
```
$ psql DB名
DB名=#
```
<br>
DBから出る
```# \q```
<br>
helpを見る
`# \? `
<br>
DBの一覧
`# \l`
<br>
他のDBに接続
```# \c DB名```
<br>
### table基本操作
table作成
`create table tablename (列名 データ型 制約);`
例)
```DBname=# create table users (id serial primary key, name varchar(20), password varchar(30));```
<br>
table構造
```# \d table名```
<br>
table一覧
`# \dt`
<br>
tableの中身をみたい
`# select * from tablename`
<br>
tableの削除
`# DROP TABLE table名;`
<br>
insert文
`# insert into posts (title ,body) values('やったー' ,'内定もらった!');`
※ valueの文字列は、''(シングルクウォート)のみ使える。
<br>
table名前変更(posts => myposts)
`# alter table posts raname to myposts`
<br>
### columnの変更
columnの追加
```# ALTER TABLE テーブル名 ADD COLUMN カラム名 データ型;```
<br>
columnの削除
```# ALTER TABLE テーブル名 DROP COLUMN カラム名;```
<br>
columnのデータ型変更
```# ALTER TABLE テーブル名 ALTER COLUMN カラム名 TYPE データ型;```
<br>
## データ型と制約
### データ型
- 数値: integer(int), real, serial
- 文字: char(5), varchar(255), text
- 真偽: boolean TRUE FALSE t f
- 日付: date, time, timestamp
### 制約
- not null (nullを認めない)
- unique (被りを許さない)
- default (デフォルト値を決めれる)
- primary key (not null, unique)
<br>
# Posgresql × Sinatra
ここからはSinatraのapp.rbに書いていく記述になります。
DB connection
```
connection = PG::connect(
:host => "localhost",
:user => "ユーザー名",
:dbname => "データベース名")
```
- ローカル環境だけで動かすのならば、dbnameだけで良い。
### SQL
変数を含んだselect文
```
name = params['name']
password = params['password']
connection.exec("select * from users where name = $1 and password = $2",[name, password]).first
```
変数を含んだinsert文
```
name = params['name']
password = params['password']
connection.exec("insert into users (name, password) values($1, $2)",[name, password])
```