めざせ趣味グラマー!!

SEやPGになるのをあきらめ趣味グラマーになるため日々修行する日記

データベースとテーブルの所有者を変更する

もう一つ備忘録。

テーブルの所有者の変更

ALTER TABLE テーブル名 OWNER TO ユーザ名;

データベースの所有者の変更

select usesysid from pg_user where usename = USER_NAME;

usesysid
----------
8931 ←ユーザによって異なる
(1 row)

update pg_database set datdba = 8931 where datname = DB_NAME;

データベースのバックアップ

今日はpostgresqlのデータをバックアップしました。
備忘録として残しておきたいと思います。

作業としては

データをバックアップ
↓
データベースのテーブルの定義変更
↓
データのリストア

という3工程を行いました。

データのバックアップ

まず特定のテーブルからのバックアップですが

$ pg_dump --format=plain test_db > test_db.sql

の様にするとプレインテキスト形式で保存してくれます。
今回はそこまで多くのクエリやテーブルが存在していなかったのでプレインテキスト形式で保存しましたが、データの数が多くなってくると容量が多くなるので注意してください。
(この場合はバイナリ形式など圧縮して出力するオプションを使うのが適切だと思います)

テーブルの定義変更(必要な場合)

先ほど保存したファイルにはクエリのデータだけでなく、テーブルの定義情報なども書かれています。
データをリストアする前にこの情報を書き換えておくことでデータのリストアと同時に変更することができます。

この次にデータのリストアをするのですが、一度データベースを削除した後、新しいデータベースを作成して(テーブルは作成しなくてよい)おきましょう。
またデータのリストアをした際に、元々入っているデータが重複するので必ずこの作業をしておきましょう。

データベースの削除と作成方法

この辺はおさらいでさらっと書いておきます。

・データベースの削除

$ dropdb dbname

・データベースの作成

$ createdb dbname

 

データのリストア

$ psql -f test_db.sql dbname

これで新しく作成したデータベースに前と同じデータが挿入されました。 今後は自動的にバックアップをとってくれるスクリプトを書いていこうと思っています。

opensshのコンパイル

今Fedora17を使用しているのですが、標準でopensshが入っています。

そのまま使用してもいいのですがどこの設定ファイルを読み込んでいるのか分からなかったので、ついでに新しいバージョンにすることにしました。

新しいバージョンは2012/08/29にリリースされたver.6.1が最新らしいです。

 

まずは標準で入っているsshを削除

yum remove openssh

※依存関係があるアプリが消えてしまうかもしれないので注意

 

次はunixコンパイルでお馴染みの

$ ./configure
$ make
# make install

でコンパイルは可能です。

 

ただし今回は指定場所にインストールしたいので、

$ ./configure --prefix=インストール場所 --sysconfig=設定ファイルを置く場所

としました。

 

debian系のOSだと設定するが簡単だったのですが、RHEL系は面倒くさいですね。

postgresqlの制約

今現在postgresqlを使ってシステムを作成しているのですが、僕のテーブル設計に問題がありUNIQUE制約を解除しないといけなくなりました。

そこでalter table文を使ってUNIQUE制約を解除しようとしたのですが、エラーが出てしまいました。

 

実はpostgresqlでは一度作成したテーブルではUNIQUE制約の解除はできない仕様らしいです。


なので

・データバックアップ

  ↓
・データ整形

  ↓

・DBにつっこむ

という方向でなんとかしていきたいと思ってますがそれまでは放置しておきます。

 

参考にさせていただいたサイト

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/psql_k05.htm

pythonの辞書で要素の追加順を保存する

pythonの辞書型は要素の順番が入れ替わってしまう可能性があります。

それは要素の追加順を保存しておく機能がないためです。

例えば

>>> user={}
>>> user['id']=1
>>> user['age']=22
>>> user['name']="test"
>>> user
{'age': 22, 'id': 1, 'name': 'test'}

となり追加した順番が異なっていることが分かります。

 

その際に一から作り直すのは面倒くさいので  辞書型→配列へとデータ構成を変更するのが面倒くさいので、そういうときはOrderedDictを使いましょう。

これはpython2.7とpython3.1で追加された機能で、辞書型に追加された順番も保存しておく事ができる機能です。

 

この機能を使うには

>>> import collections

のようにまずcollectionモジュールをインポートします。

>>> user=collections.OrderedDict()
>>> user
OrderedDict()
とするとOrderedDictオブジェクトが生成されます。

 

では先ほどと同様にして要素の追加をしてみましょう。
>>> user['id']=1
>>> user['age']=22
>>> user['name']="test"
>>> user
OrderedDict([('id', 1), ('age', 22), ('name', 'test')])

となり追加された順番が保存されていることが分かります。

この機能は特にfor文の中でin演算子を使って取り出す際に、順番に取り出せるようになります。

リストを使えば追加順を自由に設定できますが、簡単に実装したい時に使えるかと思います。

(僕の場合は辞書が追加順になっていると勘違いをして実装したので応急処置として使いましたw)

 

もしpython2.7、3.0以下のバージョンで使いたい場合はordereddictモジュールを用いる事で可能な様です。

150720追記 コードに誤りがあったため修正しました。

OrderedDictは「追加する」順番を保存する機能はあるが、書き込んだ順番の値は保存してくれません。

>>> from collections import OrderedDict
>>> test_ordereddict = OrderedDict(one = 1, two = 2, three = 3) >>> print test_ordereddict OrderedDict([('one', 1), ('three', 3), ('two', 2)])

値を追加しているようにコードを書けば、思っている実行結果になります。

>>> d1 = OrderedDict(one = 1)
>>> d1['two'] = 2
>>> d1['three'] = 3
>>> d1
OrderedDict([('one', 1), ('two', 2)], ('three', 3))


参考にしたページ
http://shannon-lab.org/?p=1743

ブログ開設

このブログでは主に

  • プログラミングではまったこと
  • プログラミングで分かったこと

を備忘録として書いていきます。

 

好きな言語

Python(3はまだ勉強中、2がメイン)

JavaOOPが理解出来ないときは嫌いだった

 

嫌いな言語

PHP←new!

Ruby(仕様がイミフ)