MySQL

Python WEBアプリをCGIで使う(後編:Part3)

今度はデータベースをSQL文なしで使うORマッパーを利用してデータベースを操作してみよう。
使うのはhttp://sqlobject.org/これはpythonの中でもなかなかわかりやすい
ORマッパーだと思います。CGIレベルで使うのであればこれで十分
Part1のプログラムを改造していじってみます。

まず最初に、MySQLでデータベースの器だけ用意しておきましょう。

[hidy@dev-mar01 py]$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12374
Server version: 5.1.69 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> create database test_db;
Query OK, 1 row affected (0.01 sec)

mysql> use test_db
Database changed
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| pyramid_db |
| test_db |
+——————–+
21 rows in set (0.00 sec)

mysql>

この例ではtest_dbというデータベースを作成しました。
次に2つモジュールを導入しましょう。

$ pip install sqlobject
$ pip install MySQL-python

ソースコードを作成します。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import string
import random
import hashlib
from sqlobject import *
import datetime

sqlhub.processConnection = connectionForURI("mysql://test:12345@localhost/test_db")

class WpUserSub(SQLObject):
    default = "CURRENT_TIMESTAMP"
    id_no = StringCol(length=6,notNone="yes",alternateID=True)
    pd_src = StringCol(length=64,notNone="yes",alternateID=True)
    enable = BoolCol(notNone="yes")
    created_at = TimestampCol()

class  Id_gen(object):
    def  __init__(self,stat):
       try:
            WpUserSub.createTable()
            self.__stat = stat
       except:
            self.__stat = stat

    def  inst(self):
       try:
           b = WpUserSub.select().max('id_no')
           b = int(b) + 1
       except:
           b = 1
       data = "%05d" % b
       pw = self.pw_gen(10)
       return {'id_no':data,'enable':self.__stat,'pd_src':pw}

    def  pw_gen(self,length):
       src = string.digits + string.letters
       s=''
       for i in range(1, length):
          s += random.choice("suhvq4v87wrnqweq3b234tb2vNN")
       s = hashlib.md5(s).hexdigest()
       return s

def main():
    p = Id_gen(1)
    print p.inst()['id_no']
    print p.inst()['enable']
    ins = WpUserSub(
        id_no = p.inst()['id_no'],
        pd_src = p.inst()['pd_src'],
        enable = p.inst()['enable'],
    )

if __name__  ==  '__main__':
    main()

導入が完了しましたら実行してみましょう。

# chmod 755 code01.py
# ./code01.py

データベースにアクセスしてテーブルができていればOK

$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12377
Server version: 5.1.69 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> use test_db
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+——————-+
| Tables_in_test_db |
+——————-+
| wp_user_sub |
+——————-+
1 row in set (0.00 sec)

mysql> desc wp_user_sub;
+————+————-+——+—–+——————-+—————————–+
| Field | Type | Null | Key | Default | Extra |
+————+————-+——+—–+——————-+—————————–+
| id | int(11) | NO | PRI | NULL | auto_increment |
| id_no | varchar(6) | NO | UNI | NULL | |
| pd_src | varchar(64) | NO | UNI | NULL | |
| enable | tinyint(1) | NO | | NULL | |
| created_at | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+————+————-+——+—–+——————-+—————————–+
5 rows in set (0.00 sec)

mysql> select * from wp_user_sub;
+—-+——-+———————————-+——–+———————+
| id | id_no | pd_src | enable | created_at |
+—-+——-+———————————-+——–+———————+
| 1 | 00001 | 6eddb71104751725f6d6894d4ddb030a | 1 | 2013-07-13 22:59:05 |
+—-+——-+———————————-+——–+———————+
1 row in set (0.00 sec)

mysql>

はい、自動的にデータベースのテーブルが作成されました。ついでにデータも1件入りましたね。
んー、便利。