前言
这段时间开始接触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
2create 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
24from 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,需要改过来。