Vagrant + MySQL データは外に置きたい

Filed in Linux | MySQL | MySQL | Vagrant Leave a comment

Windowsで使っています。
VagrantのVM上にデータまで置いちまうと何かと不便なので、vagrant氏が勝手に作ってくれる/vagrantディレクトリを通して、ホストOS上にmysqlのdatadirを持ってきちゃおうと思いました。

まずmysql停止。

んでmy.cnfを編集

[mysqld]
#datadir=/var/lib/mysql
#↓こうしてみました
datadir=/vagrant/MYSQL_DATA_DIR
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

んで、
/var/lib/mysql/mysql
にあるファイルをまるっと
/vagrant/MYSQL_DATA_DIR
にコピー。
#実際のとこ/var/lib/mysql/mysqlの中身だけ移し替えてもだめで、他にも必要ぽかった。
#あたしのばあいは空っぽから始めても差し支えなかったので、まるっと作りなおしちゃった。移行するケースの場合はいろいろ考えてあげないとだめぽ。

こう書き換えて、mysqlをスタート。ハイ失敗。まあそうだろうと思っていた。
/vagrantにあるファイルは所有者がユーザvagrantになっちゃうので、ユーザmysqlでは見られない。
あくまでローカルの開発環境の話なので、さしあたり動けばいい。

usermod -G vagrant mysql

というわけでvagrantグループにmysql氏を追加して、再度mysqldのスタート。
OKでーす。ありがとうございましたー。
あれ、

user=mysql

こいつをvagrantユーザにしても良かったのではないか。どっちも違和感あるけどどっちがマシかな。

/var/lib/mysqlに、ibdata1とかいう巨大なファイルがある。

innodb_file_per_tableを有効にしていると、テーブルのデータはそれぞれのテーブルスペースに格納される。しかし共有テーブルスペースには次のようなInnoDBの内部データが格納されている。
データディクショナリ(InnoDBテーブルのメタデータ)
チェンジバッファ
ダブルライトバッファ
UNDOログ

引用元:MySQL ibdata1が肥大化する理由(記事の意訳) | Ore no homepage

へー。知りませんでした。ほっとくとおっかないなあ。こっちはVM上にあるから、知らないうちに圧迫して死ぬとかありそう。

MySQL – 肥大化したibdata1を縮小する – Qiita

, ,

sqlalchemy.exc.NoForeignKeysError: Can’t find any foreign key relationships

Filed in MySQL | Pyramid Leave a comment

Pyramidのわだい。
SQLAlchemyがいじわるな子になっている件。
掲題のエラーが出るんですよ。

全体感としては、
models.mymodel.pyの中で

Base = declarative_base()
MyModel(Base)

こう。MyModelクラスを切っておき、他のファイルの各モデルクラスがMyModelを継承するというかんじ。
models.employee.pyには

class Employee(MyModel):

こういうのがいますという形。
なんてことないというか、以前これで普通に使えていたはずなんだけどナーというところですが
sqlalchemy.exc.NoForeignKeysError: Can’t find any foreign key relationships between ‘models’ and ‘employee’.

むむむ。なんだよ。リレーションなんて張らないよ。継承元でしかないんだけどどういうことなの。

手当たり次第にぐぐります。

そして発見

if you want your NewBase to be a descendant of Base, then you’d need to put __abstract__=True on it. But if these cols are global to everyone you could make it the superclass of your declarative Base also by passing it as “class_” to declarative_base().
the naming conventions recipe is another way to go too.

新しいBase(たぶんdeclarative_baseのことなんだろう)を使うときは、__abstract__を使ってみてとある。
なんすかそれは。
入れてみますと、これが当たりでした。

こうするとよいということですね。

class MyModel(Base):
    __tablename__ = 'models'
    __abstract__=True
    id       = Column(Integer, primary_key=True)
    status   = Column(Integer, default=1)
    created  = Column(DateTime, default=datetime.datetime.now)
    updated  = Column(DateTime, default=datetime.datetime.now)

    def __init__(self, name, value):
        self.name = name

あ、えーとPEP8違反(=の両脇にスペースたくさん入れるのNG)の記述になってます。すいません。
PyCharmもあまりにこれガミガミ言うんで警告出さないようにしちゃった。すいません。
=の位置が揃ってないと気持ち悪いんだよ。

pip install umysqldbからのerror: command ‘gcc’ failed with exit status 1

Filed in MySQL | Pyramid | Python Leave a comment

あとで自分が検索できるようにと、エラーメッセージそのものをタイトルにしちゃっています。
重宝します。

経緯はともかく解決方法

aptitude install python-dev

うわあ。
身も蓋もなかったなあ。
gccがどうだのって言われて怯んでたんですけどね。

んで

pip install MySQL-Python

おわり。

よくは知りませんが、PythonのモジュールMySQLdbとかいうのはは死に体なのか、uMySQLdbってモジュールがPyPiでは人気あるようです。スコアが高いのね。
あたしは呼べればなんでもいいですが、カッコつけてコンパイルとかしといて、結局aptさんに入れてもらって解決とか意味がわからない。
あー
コンパイルオプションなんか忘れたのかもしれないなあ。

ERROR 1030 (HY000): Got error 28 from storage engine

Filed in Database | MySQL Leave a comment

disk fullの時にクエリ動かす余裕もねえよとMySQLサーバさんが仰る。
ははあ。

du -k / | sort -n | tail -20

重たいファイル消して再確認。

#自分のサーバじゃないよ(´・ω・`)

Pylons + MongoKit + i18n

Filed in MongoDB | Pylons | Python Leave a comment

多国語対応とかやってみたい。
ということで、helper.pyに

def locale(data_dict):

    """
    dbの値(mongo)において、
    ユーザが設定している言語の文字列を優先して返す
    ない場合は言語優先順に文字列を検索して返す
    """

    if type(data_dict) != dict:
        return None

    if is_login():
        lang = session.get('userinfo', None).get('lang', None)

    val = data_dict.get('lang', None)
    if val is None:
        for lang in langlist():
            val = data_dict.get(lang, None)
            if val:
                break
    return val

def langlist():
    ll = [
        'en',   # 英語
        'ja',   # 日本語
        'es',   # スペイン語
        'fr',   # フランス語
        'it',   # イタリア語
        'ru',   # ロシア語
        'nl',   # オランダ語
        'tw',   # 繁体字台湾
        'cn',   # 簡体字中国
        'kr',   # 韓国語
        ]
    return ll

こんなの書いてたんだけど、そんなのとっくにあった。ちゃんとロケール見て切り替えるんだー。そこまでやんなきゃだめだったかー。
というわけで徒労。まあいいもんみっけたしいいか。
あたしのかいたやつ危なっかしいとこ放置してたしね……。

PylonsのHelpersでconfigをつかうには?

Filed in kvs | MongoDB | Pylons | Python Leave a comment

いやわかんないんですけど。
ちょっと詰まったものの時間切れなので備忘としてメモ。

どうなんだろと思ってhelpers.pyの先頭あたりで読んでみてprint
{‘pylons.app_globals’: None, ‘pylons.request_options’: {‘e以下略

厳しいなー
SQLAlchemy経由でなんかやってたときは困らなかったけど、Mongokitだとpylons.app_globalsにおいてあるconnection呼べないと動かせない。
こういうときのお作法はどうなってるんだろう。
Noneじゃなあ。実際動かしたときにもNoneのままかどうか確かめてみよう。

結果:
呼べてた。

def conftest():

    from pylons import config
    print(config)
    connection = config['pylons.app_globals'].connection
    print(connection)

なんだー

まあなんだ

Filed in MongoDB Leave a comment

ごちゃごちゃならべてないで動くもん出せってはなしだわな。進めよう。

u-n

Filed in MongoDB | Pylons Leave a comment

MongoKitはちょっと違う気がしてきた。
model.__init__.pyにモデルの読み込みを全部書きこむのってなんかなあ。
都度使うやつだけ読みたいんだよ。

MongoKit

Filed in Database | MongoDB | Pylons | Python Leave a comment

http://pypi.python.org/pypi/mongokit/0.7.2
mongodbのツールキット。自分でmapper書かなくてよかったのか。
Pylons supportを謳っているのがポイント高い。development.iniとかのiniファイルに接続の設定書けるみたい。
ちょうどこのへんの書き方で自分のだとなんか半端だなーとおもっていたところだったのでありがたい。
さっそく使ってみる。
現時点での最終更新が2011-08-30でversion0.7.2。旬ですね。

, , ,

E11000 duplicate key error index

Filed in kvs | MongoDB | Pylons | Python Leave a comment

メモ。pymongoのはなし。
insertであたらしいObjectIdを発行してくれないことがある。

E11000 duplicate key error index: foo.bar.$_id_  dup key: { : ObjectId('4dbbc8b7d9b1324716000000') }

なんだ?

from pymongo.objectid import ObjectId
ObjectId()
→ObjectId('4dbbed47d9b132452b000000')

結局明示的に新しいId拾ってinsertしています。なんだー。

TOP