flask与MySQL的配置操作

运行环境:
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

MySQL-python 驱动的安装:起初按照网上的yum方法

yum install MySQL-python

虽然显示了已经安装上,但是就是用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) #实例化

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 ' '.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 ''.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 ~

你可能感兴趣的:(flask,mysql)