2013年3月2日土曜日

4. MySQLを使うPyramidのプロジェクトを作る

Djangoじゃないのをやってみようということで、Pyramidをさわってみる。
そのときの記録。
今回はMySQLを使うPyramidのプロジェクトを作ってみる。
  • 環境
  • MacOS 10.8.2
    Python 2.7.3 (MacPortsでインストールしたものを使用する)
    MySQL 5.5.28 (MacPortsでインストールしたものを使用する)
    py27-pip 1.2.1 (MacPortsでインストールしたものを使用する)
    Apache 2.2.7 (標準でインストールされているもの)
    (mod_wsgiはソースを落としてきてインストール)
    Eclipse 4.2.1
    Pydev 2.7.1

  • MySQLの準備
  • 前回 3. MySQLのインストール でインストールしたMySQLを使う。
    MySQLにこのプロジェクトで使うデータベース「pyramid_db」と、ユーザー「pyramid_user」を作成しておく。
    MySQLに入る。
    $ mysql -u root -p mysql

    データベースの作成。
    mysql> CREATE DATABASE pyramid_db CHARACTER SET utf8;

    そのデータベースのユーザーの作成。
    GRANT ALL ON pyramid_db.* TO pyramid_user@localhost IDENTIFIED by "password";
    

    ちゃんと作成できたか確認する。
    $ mysql -u pyramid_user -p pyramid_db
    mysql> create table book (id int(11), title varchar(64));
    mysql> show tables;
    +----------------------+
    | Tables_in_pyramid_db |
    +----------------------+
    | book                 |
    +----------------------+
    1 row in set (0.00 sec)
    mysql> drop table book;
    

  • 新しい環境の作成
  • virtualenvで環境「env_mysql」を作って、そこにPyramidをインストールする。
    $ virtualenv --no-site-packages env_mysql
    $ cd env_mysql
    $ bin/pip install pyramid
    

  • SQLAlchemy を使った Pyramid Project の作成
  • $ bin/pcreate -s alchemy MyProject
    
    $ cd MyProject
    $ ../bin/python setup.py develop
    $ ../bin/python setup.py test -q
    $ ../bin/pserve development.ini
    で、http://localhost:6543に表示される。
    でも、表示されるのはエラーメッセージ。
    Pyramid is having a problem using your SQL database.

    残念ながら、動かす前にデータベースの初期化が必要だというメッセージが表示される。
    $ ../bin/initialize_MyProject_db development.ini 

    これでもう一度pserve。
    $ ../bin/pserve development.ini
    で、http://localhost:6543に表示される。

    参考にしたのはここ。
    SQLAlchemy + URL Dispatch Wiki Tutorial

  • ソースの修正の前にEclipseプロジェクトを作成する
  • Eclipseのプロジェクトにしておいた方が、修正や動作確認が楽。
    Eclipseを立ち上げて、workspaceを先ほど作成した「env_mysql」ディレクトリにする。
    新規のworkspaceの場合は、Open Perspective で PyDevを追加する。
    環境設定 → PyDev → Interpreter Python で、「env_mysql/bin/python」を登録する。
    System PYTHONPATHに次のディレクトリも含める。これにチェックを入れておく。
    /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
    やっとここで、Eclipseの新規プロジェクト作成。PyDevのPyDev Projectで、名前は先ほど作成したPyramidのプロジェクトと同じMyProjectとする。
    Eclipseの環境設定にある PyDev Interpreter - PythonのString Substitution Variablesに「run_pyramid」で、値が自分の環境にあるbin/pserveとなる項目を追加する。
    さらにRun Configurationで、次の項目を設定する。
    Main: Project -> MyProject
    Main: Main Module -> ${run_pyramid}
    Arguments: Program arguments -> development.ini
    これで、Eclipseから実行することができる。ステップ動作も可能となる。

  • プロジェクトを修正してMySQLと接続する
  • development.iniとproduction.iniにある次の行を修正する。
    <変更前>
    sqlalchemy.url = sqlite:///%(here)s/MyProject.sqlite
    <変更後>
    sqlalchemy.url = mysql://pyramid_user:password@localhost:3306/pyramid_db?charset=utf8&use_unicode=1
    sqlalchemy.pool_recycle = 3600

    setup.pyで「mysql-python」の追加。
    requires = [
        'pyramid',
        'SQLAlchemy',
        'transaction',
        'pyramid_tm',
        'pyramid_debugtoolbar',
        'zope.sqlalchemy',
        'waitress',
        'mysql-python',
        ]
    

    myproject/models.pyで、フィールド型のTextをStringに変更する。
    from sqlalchemy import (
        Column,
        Integer,
        String,
        )
    

    同じくmyproject/models.pyのモデルのフィールド定義(class MyModel(Base):)のところもTextをStringにする。長さを指定し、uniqueは削除する。
    <変更前>
        name = Column(Text, unique=True)
    
    <変更後>
        name = Column(String(200))
    

    testしておく。ここで、ライブラリが読み込まれる。
    $ ../bin/python setup.py test -q

    /tmp/mysql.sockではなく、/opt/localのsockを読みに行ってしまうので、シンボリックリンクを作成しておく。
    $ sudo ln -s /tmp/mysql.sock /opt/local/var/run/mysql55/mysqld.sock
    

    その後、initialize_My_project_dbを実行する。
    $ ../bin/initialize_MyProject_db development.ini
    

    mysql> show tables;
    +----------------------+
    | Tables_in_pyramid_db |
    +----------------------+
    | models               |
    +----------------------+
    1 row in set (0.00 sec)
    mysql> show fields from models;
    +-------+--------------+------+-----+---------+----------------+
    | Field | Type         | Null | Key | Default | Extra          |
    +-------+--------------+------+-----+---------+----------------+
    | id    | int(11)      | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(200) | YES  |     | NULL    |                |
    | value | int(11)      | YES  |     | NULL    |                |
    +-------+--------------+------+-----+---------+----------------+
    3 rows in set (0.00 sec)
    
    mysql> select id, name, value from models;
    +----+------+-------+
    | id | name | value |
    +----+------+-------+
    |  1 | one  |     1 |
    +----+------+-------+
    1 row in set (0.00 sec)
    
    mysql> 

    Eclipseから、あるいは次のコマンドで実行するとPyramidのページが表示される。
    $ ../bin/pserve development.ini
    

    ここを参考にした。
    チラ裏 nginxとpythonとpyramid MySQLの設定
次回は、wsgiでの動作確認。

P.S.
2014.01.24
久しぶりに、新しくプロジェクトを作成してみたところ・・・
initialize_xxxx_db を実行すると「ImportError: No module named MySQLdb」と言われた。
で、MySQLdb をインストールする。
$ bin/pip install MySQL-python

もうあるぞ「Requirement already satisfied (use --upgrade to upgrade): MySQL-python in ./pyramid_xxxx/MySQL_python-1.2.5-py2.7-macosx-10.9-x86_64.egg」、と言われてインストールできない。
プロジェクトのディレクトリをみると「MySQL_python-1.2.5-py2.7-macosx-10.9-x86_64.egg」というファイルがあるので、これを削除してリトライ pip install。
うまくインストールできた。

こちらもよろしく。
Pyramid 1.5 + jinja2-alchemy-starter で MySQL の authentication

0 件のコメント:

コメントを投稿