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さんに入れてもらって解決とか意味がわからない。
あー
コンパイルオプションなんか忘れたのかもしれないなあ。

TOP