PostgreSQLのテーブルに他テーブルを結合する(行として加える)

例えばTable1とTable2があって、カラムは同じだとする。各々300行あって、いまんところ300行×2テーブルあるのだけど、これを600行の1テーブルにまとめたい。こういう場合にはINSERT INTOを使うと良い。

INSERT INTO Table1 SELECT * FROM Table2

あんまりよくわかってないのがPostgresにおけるシングルクオートとダブルクオートの違い。単純な文字列の場合はシングルクオート使う。カラム名なんかはダブルクオート使うでいいのかな。

SELECT文の書き方で、テーブル中の必要要素だけを取り出して加えることができる。

INSERT INTO Table1 SELECT "UserId" FROM Table2

とか。

PostgreSQLにテキストデータ(CSVやTSVファイル)を格納する

PostgreSQLCSVやTSVなどのテキストファイルを読み込んで、テーブル上に格納することができます。ここで使うのはPostgreSQLのCOPYコマンドです。

事前準備

取り込むもとになるテキストデータが存在する場所のアクセス権設定しだいでエラーが出る場合があります。 雑なやり方ですが、Windows環境の場合ではProgram Files¥PostgreSQL以下にデータインポート用のフォルダをつくってしまい、ユーザ名postgresにアクセス権を全付与してやると良いです。

やり方が環境に依存しますので(Win7の場合はPostgresにアクセス権付与した気がするし、Win8はデフォルトUserにアクセス権付与でOKなような気が)、一律にやり方を書きだせません。なんかエラーが出たらコメントで教えてもらえると助かります。

ファイルを格納する前にデータを取り込むDB&テーブルを作成しておきます。当然ですが、投入するテキストデータのデータ形式に合わせないといけません。

CREATE TABLE 'UserList' (
'UserId' integer,
'UserName' text
)

数値のデータを入れるカラムは数値型(intとか)。文字列を入れるのなら文字列型(textやvar charとか)を指定しましょう。

DBの作成方法は省略していますが、pgAdminでサーバを右クリックして「新規DB作成」ですぐに作成できます。

今回入力するテキストデータはユーザID(UserId)、ユーザ名(UserName)の二種類が入ってると仮定しています。テーブル名はUserList。PostgreSQKのCREATE TABLEを使ってテーブルを作成しました。pgAdminでSQLエディタを起動してから、上述のクエリを流し込むとテーブルができると思います。

TSVファイルの格納

Postgresのデフォルトはタブ区切り(TSV)なので、まずタブ区切りのファイルを読み込ませる方法から。PostgreSQLの配下にImportという名前のフォルダを作ってアクセス権を付与したとして、ファイルUserList01.tsvを読み込むためには

COPY 'UserList' FROM 'C¥Program Files¥PostgreSQL¥Import¥UserList01.tsv';

こんな感じでSQLを書きます。複数ファイルがあっても大丈夫。

COPY 'UserList' FROM 'C¥Program Files¥PostgreSQL¥Import¥UserList01.tsv';
COPY 'UserList' FROM 'C¥Program Files¥PostgreSQL¥Import¥UserList02.tsv';
COPY 'UserList' FROM 'C¥Program Files¥PostgreSQL¥Import¥UserList03.tsv';

下の書き方をするとデータがテーブルに追加されていきます。いわゆる追加(Append)のような挙動です。

CSVファイルの格納

CSVファイルの場合は引数をつける必要があります。

COPY 'UserList' FROM 'C¥Program Files¥PostgreSQL¥Import¥UserList01.tsv' USING DELIMITER '.';

USING DELIMITER以下の文字を変えることで、他の形式にも対応できるので、変な区切り文字でも大丈夫。

ArduinoとAM2302を使って温湿度センサを作る

以前satzzさんから教えて貰った内容の忘備録。同じものを作ろうと試みたら結構時間がかかってしまったので。

使用するのはArduino Uno と温湿度センサAM2302

両方とも秋葉原で買える。AM2302はeBayなんかを使うと半額程度で調達できるみたいです。

配線

データシートを見たら書いてあるけど、せっかくなのでFritzingを使って配線図をおこしてみました。 使うのはArduino、AM2302、ジャンパーピン、10Kオーム抵抗などなど。

f:id:kazutaka83:20150322150609p:plain

プログラム

参考にしたのは以下。

qiita.com

今回使っているAM2302は専用のライブラリがあるのでダウンロードしてArduinoのライブラリフォルダに叩き込みます。これを知らなかったので、センサが謎の3を吐き出す装置に成り下がっていました。

ダウンロードのやり方はgitから

$ git clone https://github.com/adafruit/DHT-sensor-library /Applications/Arduino.app//Contents/Resources/Java/libraries/DHT

Arduinoのライブラリフォルダは環境に依存するので調べてください。ここらへんで言ってるArduinoは機器名称じゃなくてArduino IDEこれを指してる。

コードはとりあえずsatzzさん作のものをそのまま使う。

#include <DHT.h>
#define DHTTYPE DHT22
#define DHT22_PIN 7
DHT dht(DHT22_PIN, DHTTYPE);

void setup() {
  pinMode(DHT22_PIN, INPUT);      
  Serial.begin(9600);
}

char ch[10];
char ct[10];

void loop()
{
  float h  = dht.readHumidity() ;
  float t  = 5.0/9.0*(dht.readTemperature(true)-32.0); // fahrenheit -> celsius
  dtostrf(h, 6, 2, ch);
  dtostrf(t, 6, 2, ct);

  String postData = "{humidity:";
  postData.concat(ch);
  postData.concat(",temperture:");
  postData.concat(ct);
  postData.concat("}");

//  Serial.print("POST /api/measurements HTTP/1.1\r\n");
//  Serial.print("Content-Length: " + String(postData.length()) + "\r\n\r\n");
  Serial.println(postData);

  delay(1000);

}

これでArduinoから書き込んで、シリアルポートを読みだしてやると温度湿度がとれるはず。

f:id:kazutaka83:20150319235352p:plain

RaspberryPiでBluetooth通信(デバイス認証)

自宅内にBluetoothネットワーク網を作りたい。 各種センサーデータをBluetoothで飛ばして未来の家を作るのだ。

f:id:kazutaka83:20150319204207j:plain

センサーデータ集約のための子機はArduino(互換)+BLEで構築したいのでBlend Microを使う予定。まだ買ってない。

親機は自宅のUbuntu Serverを使う予定。テストとしてRaspberry PiMacbookBluetooth通信を試す。

BlueZのインストール

BluezはLinuxベースのOS上で動くBluetoothプロトコルスタック

Bluetoothのはなし(4)|Wireless・のおと|サイレックス・テクノロジー株式会社

こまかな仕様は上記リンク先を参考に。内容が重たいっす。。

インストール自体はパッケージマネージャから簡単にできた。

pi@raspberrypi ~ $ sudo apt-get install bluez

ドングルを差し込んでhciconfigで確認する。

pi@raspberrypi ~ $ hciconfig 
hci0:   Type: BR/EDR  Bus: USB
    BD Address: 00:1B:DC:09:A5:BD  ACL MTU: 310:10  SCO MTU: 64:8
    UP RUNNING PSCAN 
    RX bytes:3043 acl:0 sco:0 events:83 errors:0
    TX bytes:1292 acl:0 sco:0 commands:75 errors:0

UP RUNNING PSCANになっているので動いてる。 iPhoneAndroid端末のBluetooth設定画面から、ペアリングモードにしてhcitoolを使う。

pi@raspberrypi ~ $ hcitool scan
Scanning ...
    AC:22:0B:9C:CC:61   Nexus 7

ペアリングモードに入ってたNexus 7が見えた。

Macbook AirBluetooth設定開いた状態で同じくコマンドを打つと。

pi@raspberrypi ~ $ hcitool scan
Scanning ...
    AC:22:0B:9C:CC:61   Nexus 7
    B8:8D:12:19:03:03   MacbookAir

これも見えた!


スポンサード リンク