データベースとテーブルの所有者を変更する
もう一つ備忘録。
テーブルの所有者の変更
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=設定ファイルを置く場所
としました。
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()
>>> 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