flask與MySQL的配置操作,flaskmysql配置

來源:互聯網
上載者:User

flask與MySQL的配置操作,flaskmysql配置

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

寫在前面之解決bug: 
SQLALCHEMY_DATABASE_URI 思維定式寫成SQLALCHEMY_DATABASE_URL,這個bug極其隱蔽; 
將session[‘known’] 寫成session[‘knowm’]因為是字串命名寫錯,idle檢查不出來,修複這個bug 也花費了很長時間,要細心!

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

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 實現資料庫遷移。(到現在還沒弄明白,資料庫遷移怎麼體現出來作用,以後弄懂再說)

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

pip install flask-sqlalchemy
  • 1

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

yum install MySQL-python
  • 1

雖然顯示了已經安裝上,但是就是用import匯入的時候顯示找不到module,後來在虛擬環境下又用pip安裝了才可以,具體大家可以Google安裝方法。這裡給大家提供個思路,yum安裝識別不了,可以嘗試pip。

1,設定資料庫 
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) #執行個體化
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2,定義模型,建立關係: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')#建立兩表之間的關係,其中backref是定義反向關係,lazy是禁止自動執行查詢(什麼鬼?)     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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

3,以上步驟之後,可以進行資料庫操作了(命令列) 
建立表

 if __name__ == '__main__':     db.create_all() #直接在hello.py檔案中加,在python命令列下輸入太麻煩
  • 1
  • 2

插入行:

 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()#提交會話到資料庫
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

運行hello.py 程式,此時開啟phpMyAdmin 可以看到資料庫text1 中已經有roles表和users表,此時可以嘗試在python中敲命令列: 
修改

admin_role.name ='Adminstrator'db.session.add(admin_role)#添加到資料庫db.session.commit()#提交到資料庫
  • 1
  • 2
  • 3

刪除:

db.session.delete(mod_role)db.session.commit()
  • 1
  • 2

查詢:

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

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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在formindex.html 檔案中添加:

    {% if not known %}    <p>please to meet you !</p>    {% else %}    <p>happy to see you again!</p>    {% endif %}
  • 1
  • 2
  • 3
  • 4
  • 5

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 參數是規定要傳人的上下文環境
  • 1
  • 2
  • 3
  • 4

這樣在命令列中可以不用匯入app之類的,就可以使用app執行個體。

6,最後是資料庫遷移,有點想git中的版本庫,但是具體作用表現沒弄懂: 
沒辦法,先抄一遍代碼吧 
安裝:pip install flask-migrate 
配置(在hello.py中):

from flask.ext.migrate import Migrate,MigrateCommandmigrate = Migrate(app,db) #建立執行個體manager.add_command('db',MigrateCommand)#將MigrateCommand類傳給db
  • 1
  • 2
  • 3

建立遷移倉庫:

(venv) $ python hello.py db init   # 有木有很像git
  • 1

自動建立遷移指令碼:

(venv) $ python hello.py db migrate -m "initial migration" #手動是用revision 命令
  • 1

更新:

(venv ) $ pyhton hello.py db upgrade 
  • 1

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

http://blog.csdn.net/happy_bigqiang/article/details/50935935

查看評論

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.