読者です 読者をやめる 読者になる 読者になる

c-bata web

@c_bata_ のメモ。python多め

Flask-SQLAlchemyメモ

Flask Python Webアプリ

はじめに

この前Webアプリを書いた時にFlask-SQLAlchemy使ったので忘れないうちにメモ。

DBの設定・作成

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)

上のようにSQLALCHEMY_DATABASE_URIに値をセットし、dbインスタンスを作成すれば準備OK。


テーブルの定義

class User(db.Model):
  __tablename__ = 'users'
  id = db.Column(db.Integer, primary_key = True)
  name = db.Column(db.String(64))
  email = db.Column(db.String(64), unique=True)
  pwdhash = db.Column(db.String(54))
   
  def __init__(self, name, email, password):
    self.name = name
    self.email = email
    self.set_password(password)

  def __repr__(self):
    return '<User %r>' % self.name
     
  def set_password(self, password):
    self.pwdhash = generate_password_hash(password)
   
  def check_password(self, password):
    return check_password_hash(self.pwdhash, password)

ユーザ情報を管理するテーブルを↑のように定義したとき、次のように扱っていきます。ちなみに__repr__メソッドは、printした時にobject-idではなくユーザ名などを表示するために使えます。定義しておくとデバッグ時に便利です。


その他 https://pythonhosted.org/Flask-SQLAlchemy/models.html

説明
Integer an integer
String (size) a string with a maximum length
Text some longer unicode text
DateTime date and time expressed as Python datetime object.
Float stores floating point values
Boolean stores a boolean value
PickleType stores a pickled Python object
LargeBinary stores large arbitrary binary data


テーブルの作成

テーブルの作成はたいていの場合、デプロイした後に1回行ってしまえばいいので、デプロイ先にsshで起動して、pythonインタプリタから直接行う。

$ python
>>> from app import db
>>> db.create_all()

ちなみにテーブルを削除したい時は

$ python
>>> from app import db
>>> db.drop_all()

Flaskのコードを読んでいると下のように記述している方も居ました。

@app.before_first_request
def init():
    db.create_all()


挿入・削除・更新

挿入

user = User('userA', 'user-a@example.com', 'user_a_password')
db.session.add(user)
db.session.commit()

削除

user = db.session.query(User).filter_by(name='userA').first()
db.session.delete(user)
db.session.commit()

更新

user = db.session.query(User).filter_by(name='userA').first()
user.name = "user_a"
db.session.flush()


今後の課題

まだまだ勉強不足なので、ある程度理解したらまた記事にします。

参考

Flask Web Development: Developing Web Applications with Python

Flask Web Development: Developing Web Applications with Python