第五章--データベース

3966 ワード

一、SQLデータベース
リレーショナル・データベースとも呼ばれ、リレーショナル・データベースはデータをテーブルに格納し、テーブル・シミュレータの異なるエンティティを表します.表の列数は定義時に固定され、行数は可変である.列は表に示すエンティティのデータ属性を定義し、行は各列に対応する実際のデータを定義します.リレーショナル・データベース・エンジンは、結合操作に必要なサポートを提供します.
二、NoSQLデータベース
リレーショナル・データベース・モデルに従わないすべてのデータベースを総称してNoSQLデータベースと呼びます.NoSQLはテーブルの代わりにコレクションを使用し、レコードの代わりにドキュメントを使用します.NoSQLが採用した設計方法では、結合操作が難しいため、ほとんどのNOSQLデータベースではサポートされていません.NoSQLはテーブルの数を減らし、データの重複量を増やしますが、このデータの重複はクエリーの速度を向上させることができます.
三、SQLを使うか、それともNoSQLを使うか
SQLデータベースは、構造化されたデータを効率的かつコンパクトに格納するのに役立ちます.NoSQLは、一貫性の要件を緩和し、パフォーマンスのメリットを提供します.中小型Webプログラムでは、SQLもNoSQLも優れた選択であり、パフォーマンスも優れています.
四、Pythonデータベースフレームワーク
PASS
五、Flask-SQLAlchemyを使用してデータベースを管理する
pip install flask-sqlalchemy

SQLAlchemyは強力なリレーショナル・データベース・フレームワークであり、複数のデータベース・バックグラウンドをサポートし、上位ORMを提供し、データベースの元のSQLを使用する下位機能も提供しています.
MySQL:mysql://username:password@hostname/database
Postgres:postgresql://username:password@hostname/database
SQLite(Unix):sqlite:////absolute/path/to/database
SQLite(Windows):sqlite:///c:/absolute/path/to/database

SQLiteはサーバを必要としないので、他の情報を指定する必要はありません.databaseはファイル名プログラムで使用されるデータベースURLです.Flask構成オブジェクトに保存する必要があるSQLALCHEMY_DATABASE_URIキーにあります.SQLALCHEMY_の設定COMMIT_ON_TEARDOWNはTrueで、リクエストが終了すると自動的に送信されます
六、モデルの定義
モデルはプログラムが使用する永続化エンティティを表し、ORMではモデルがPythonクラスであり、クラス属性はデータベーステーブルの列に対応する.
from flask.ext.sqlalchemy import SQLAlchemy  #    

basedir = os.path.abspath(os.path.dirname(__file__)) #       

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = \ #     URL
    'sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True #      

db = SQLAlchemy(app)  #   

class Role(db.Model):    #   db.Model      
    __tablename__ = 'roles'    #  
    id = db.Column(db.Integer, primary_key=True)  #   ,  ,Int  
    name = db.Column(db.String(64), unique=True) #   ,Str  ,64   ,     

    def __repr__(self):     #                 ,      
        return ''%self.name

七、関係
リレーショナル・データベースは、リレーショナルを使用して異なるテーブルのローを関連付けます.関係には、一対一の関係、一対多の関係などがあります.
class Role(db.Model):
    #...
    users = db.relationship('User', backref='role')
    #db.relationship()                    
    #backref    User       role  ,      
class User(db.Model):
    #...
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id')
    #db.ForeignKey          roles    id 

八、データベース操作
1、テーブルの作成
#  python shell   ,  hello         
from hello import db
db.create_all()      #    
db.drop_all()      #    

2-8、データベース操作(shell)
ここではpython shellでデータベース操作を行い、後でピットを埋めます.
9、ビュー関数でデータベースを操作する
from model import User
User.query.filter_by(username=form.name.data).first()    #  
user = User(username=form.name.data)        #  
db.session.add(user)    #    

10、python shellの統合
shellセッションを開始するたびにデータベースインスタンスとモデルをインポートするのは面倒ですが、常にインポートしないようにFlask-Scriptのshellコマンドを使用して特定のオブジェクトを自動的にインポートできます.
from flask.ext.script import Shell
def make_shell_context():
    return dict(app=app, db=db, User=User, Role=Role)
manager.add_command("shell", Sheel(make_context=make_shell_context))

make_shell_context()関数はプログラム、データベースインスタンス、モデルを登録し、shellに直接インポートできます.
11.Flask-Migrateによるデータベース移行
1、移行倉庫の作成
pip install flask-migrate
from flask.ext.migrate import Migrate, MigrateCommand
#...
migrate = Migrate(app, db)
manager.add_command('db', MigrateCommand)  #      manager 

python model.py db init    #      
#       migrations   ,           

2、移行スクリプトの作成
python model.py db migrate -m "initial migration" #        

3、データベースの更新
python model.py db upgrade

この操作はまずdbを用いる.created_all()は,変更をデータに適用し,既存のデータに影響を及ぼさない.