Python flask使用经验教训总结

前言

这段时间开始接触flask,中间遇到些问题,也走过写弯路,本片博客用来说明下自己这段时间内踩的坑。

正文

问题一:在使用SQLAlchemy管理MySQL数据库时,创建db实例时报错,提示Import MySQLdb出错

要说明的是,在使用SQLAlchemy时,要先安装好MySQL数据库和MySQLdb,因为SQLAlchemy会调用MySQLdb模块。Windows下安装MySQLdb模块可以看一看这篇博客,如果是linux下安装则可以参考我的这篇博客

问题二:同样在使用SQLAlchemy时,执行db.create_all()创建数据表时提示OperationalError: (_mysql_exceptions.OperationalError) (1045, “Access denied for user ‘ODBC’@’localhost’ (using password: NO)”)

分析,权限不够,没有在数据库中给所操作的数据库授权。
可以采用类似下面的方式,例如数据库名为test,则授权语句为

1
grant select ,insert,update,delete,lock tables on test.* to username@localhost identified by 'password';

上面的username处填写自己的用户名,password处填写自己连接时的密码。

问题三:使用SQLAlchemy时,执行db.create_all()时出错,提示:OperationalError: (_mysql_exceptions.OperationalError) (1049, “Unknown database ‘flasky’”)

分析:错误提示未知数据库”flasky”,因为在MySQL数据库中这个名为flasky的数据库根本不存在。注意,进行创建表操作前,必须保证首先所需的数据库已经在MySQL中创建好。这个数据库的名字在创建flask应用时设置

1
app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:root@localhost/flasky'

上面最后的flasky就是所用的数据库的名字,这个要在MySQL数据库中建好。
所以,合理的顺序是:首先在MySQL中创建好flasky数据库,然后授权,再之后在flask应用中定义类型,并创建数据表
上述过程类似如下操作:

  • 首先在数据库中定义数据库并授权

    1
    2
    create database flasky;
    grant select,insert,update,delete,lock tables on flasky.* to username@localhost identified by 'password';
  • 接下来在flask代码中定义ORM,创建SQLAlchemy实例并在必要的时候使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    from flask.ext.sqlalchemy import SQLAlchemy

    app=Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI']='mysql://username:password@localhost/flasky' #使用MySQLdb数据库
    app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']=True #设置为自动提交

    #下面定义两个数据表
    class Role(db.Model):
    __tablename__='roles'
    id=db.Column(db.Integer,primary_key=True)
    name=db.Column(db.String(64),unique=True)
    users=db.relationship("User",backref="role")

    def __repr__(self):
    return '<Role %r>'%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 %r>'%self.username

然后可以在python shell下执行db.create_all()方法在数据库中创建两个数据表。

问题四:在使用模板引擎时正文采用中文会出现utf8 decode error的错误出现

原因是模板文件的编码不对,最好采用utf8无BOM的格式。在notepad++ 中默认编码是ANSI,需要改过来。

文章目录
  1. 1. 前言
  2. 2. 正文
    1. 2.1. 问题一:在使用SQLAlchemy管理MySQL数据库时,创建db实例时报错,提示Import MySQLdb出错
    2. 2.2. 问题二:同样在使用SQLAlchemy时,执行db.create_all()创建数据表时提示OperationalError: (_mysql_exceptions.OperationalError) (1045, “Access denied for user ‘ODBC’@’localhost’ (using password: NO)”)
    3. 2.3. 问题三:使用SQLAlchemy时,执行db.create_all()时出错,提示:OperationalError: (_mysql_exceptions.OperationalError) (1049, “Unknown database ‘flasky’”)
    4. 2.4. 问题四:在使用模板引擎时正文采用中文会出现utf8 decode error的错误出现
,