Flask與MySQL的配置操作

運行環境:
Centos6.7 ; python 2.7.11;

——————————分割線之預備知識:

1,roles表中爲id列添加主鍵屬性,另一張表users爲role_id列添加外鍵屬性,這樣主鍵就對應上外鍵,產生了一旦在roles表中修改完角色名(roles表中的name列的行值),所有通過role_id引用這個角色的用戶都能立即看到更新的關係,故取名關係型數據庫。
2,NoSQL數據庫一般使用集合代替表,使用文檔代替記錄;使用NoSQL數據庫的好處是,數據重複可以提升查詢速度。
3,操作數據庫有幾種方法:
a,可以在數據庫命令行寫SQL語句,即底層操作數據庫。
b,在python中可以用一些數據庫驅動比如MySQL-python驅動來操作數據庫,驅動對底層繁瑣命令進行了封裝。
c,在flask中使用SQLAlchemy數據庫框架對數據庫驅動進一步封裝,進一步簡化命令。因此SQLAlchemy不是數據庫,而是對數據庫進行操作的一種框架。

——————————分割線之數據庫管理
預備知識結束,那麼對數據庫進行管理有以下幾個步驟:
1,配置數據庫。
2,定義數據庫模型,並對數據庫中的表建立關係。
3 , 數據庫的基本操作(命令行中操作):
創建表,插入行,修改行,刪除行,查詢行
4,視圖函數中操作數據庫
5,集成python shell
6,flask-migrate 實現數據庫遷移。(到現在還沒弄明白,數據庫遷移怎麼體現出來作用,以後弄懂再說)

——————————神奇的分割線之具體步驟
1,安裝
SQLAlchemy的安裝

pip install flask-sqlalchemy

MySQL-python 驅動的安裝:起初按照網上的yum方法

yum install MySQL-python

雖然顯示了已經安裝上,但是就是用import導入的時候顯示找不到module,後來在虛擬環境下又用pip安裝了纔可以,具體大家可以Google安裝方法。這裏給大家提供個思路,yum安裝識別不了,可以嘗試pip。
2,配置數據庫
flask 配置MySQL數據庫與sqlite不同,首先你要先自己創建好數據庫,有一個數據名稱,才能用,而sqlite沒有數據庫運行SQLAlchemy時會自動給你創建數據庫,所以配置數據庫之前,你要用其他方法先建一個空的數據庫,推薦大家用phpMyAdmin(PS:後來又發現了一個更好用的工具:安裝簡單操作界面是中文的,就是激活稍微麻煩了點,Navicat for MySQL,強烈安利初學者使用),博主是根據以下鏈接安裝的,親測靠譜:
http://blog.sina.com.cn/s/blog_70545bad0101khx3.html
這裏我提前用phpMyAdmin建了一個名爲text1的數據庫,然後在hello.py文件中寫代碼:
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(name)
app.config['SECRET_KEY'] ='hard to guess'
app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:密碼@localhost:3306/text1' #這裏登陸的是root用戶,要填上自己的密碼,MySQL的默認端口是3306,填上之前創建的數據庫名text1
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']=True #設置這一項是每次請求結束後都會自動提交數據庫中的變動
db = SQLAlchemy(app) #實例化

3,定義模型,建立關係
hello.py 中

class Role(db.Model):
      __tablename__ = 'roles' #定義表名
     id = db.Column(db.Integer,primary_key=True)#定義列對象
     name = db.Column(db.String(64),unique=True)
     user = db.relationship('User',backref='role',lazy='dynamic')#建立兩表之間的關係

     def __repr__(self):
         return '<Role {}> '.format(self.name)

 class User(db.Model):
     __tablename__ = 'users'
     id = db.Column(db.Integer,primary_key = True)
     username = db.Column(db.String(64),unique=True,index=True)
     role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))

     def __repr__(self):
         return '<User {}>'.format(self.username)

3,以上步驟之後,可以進行數據庫操作了(命令行)
創建表

 if __name__ == '__main__':
     db.create_all() 

直接在hello.py文件中加,在python命令行下輸入太麻煩

插入行:

 admin_role =Role(name = 'Admin') #實例化
 mod_role = Role(name = 'Moderator')
 user_role =Role(name = 'User')
 user_john = User(username = 'john',role=admin_role)#role屬性也可使用,雖然他不是真正的數據庫列,但卻是一對多關係的高級表示
 user_susan = User(username = 'susan',role= user_role)
 user_david = User(username = 'david',role = user_role)
 db.session.add_all([admin_role,mod_role,user_role,user_john,user_susan,user_david])  # 準備把對象寫入數據庫之前,先要將其添加到會話中,數據庫會話db.session和Flask session對象沒有關係,數據庫會話也稱事物
 db.session.commit()#提交會話到數據庫

運行hello.py 程序,此時打開phpMyAdmin 可以看到數據庫text1 中已經有roles表和users表,此時可以嘗試在python中敲命令行:
修改:

admin_role.name ='Adminstrator'
db.session.add(admin_role)#添加到數據庫
db.session.commit()#提交到數據庫

刪除:

db.session.delete(mod_role)
db.session.commit()

查詢:

User.query.filter_by(role=user_role).all() #注意過濾器的使用

4,視圖函數中操作:
hello.py文件中:

 @app.route('/',methods=['GET','POST'])
 def index():
     myform = NameForm()
     if myform.validate_on_submit():
         user = User.query.filter_by(username=myform.name.data).first()

         if user is None:
             user = User(username=myform.name.data)
             db.session.add(user) #注意這裏不接着用commit()函數,正是因爲前面設置了app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']=True ,所以會SQLAlchemy會自動幫你commit.
             session['known'] = False  
         else:
             session['known'] = True
         session['name']= myform.name.data
         myform.name.data = ''
         return redirect(url_for('index'))
     return render_template('formindex.html',form=myform,name=session.get('name'),known=session.get('known',False))

在formindex.html 文件中添加:

    {% if not known %}
    <p>please to meet you !</p>
    {% else %}
    <p>happy to see you again!</p>
    {% endif %}

5,集成Python shell ,如果之前的第三步是在命令行操作,你就會知道每次都要在shell中導入數據庫實例和模型,相當麻煩,可以在hello.py中添加:

from flask.ext.script import Shell 
def make_shell_context():
    return dict(app=app,db=db,User=User,Role=Role) #右邊app是指hello.py中的實例對象,左邊app是自己命名,以後可以在命令行中輸入,就調用了app實例
manager.add_command('shell',Shell(make_context=make_shell_context)) #添加shell 命令,Shell類中make_context 參數是規定要傳人的上下文環境

這樣在命令行中可以不用導入app之類的,就可以使用app實例。
6,最後是數據庫遷移,有點想git中的版本庫,但是具體作用表現沒弄懂:
沒辦法,先抄一遍代碼吧
安裝:pip install flask-migrate
配置(在hello.py中):

from flask.ext.migrate import Migrate,MigrateCommand
migrate = Migrate(app,db) #創建實例
manager.add_command('db',MigrateCommand)#將MigrateCommand類傳給db

創建遷移倉庫:
(venv) $ python hello.py db init # 有木有很像git

自動創建遷移腳本:
(venv) $ python hello.py db migrate -m "initial migration" #手動是用revision 命令

更新:
(venv ) $ pyhton hello.py db upgrade

至此,flask與MySQL數據庫的基本操作就告一段落了,see you ~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章