Flask-SQLAlchemy管理数据库

关于Flask-SQLAlchemy以前就写过一篇Flask数据库扩展Flask-SQLALchemy,不过当时并没能搞懂具体如何使用。现在阅读了不少相关英文材料后,最终还是选择了它。

关于Flask-SQLAlchemy的介绍及管网教程等可以看上面那一片。这里主要讲一下如何使用他管理数据库。

配置数据库

1
2
3
4
5
6
7
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////root/test/monitorDB.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
  1. 导入Flask主函数及SQLAlchemy扩展
  2. 设置数据库目录,如果用MYsql则采用
1
app.config['SQLALCHEMY_DATABASE_URI'] = 'msql://your-username:[email protected]/ufosightings'

设置数据库数据类

创建一个配置文件,如monitorDB.db,这个名字一定要起好,因为后续数据库引用操作都需要用到。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////root/test/monitorDB.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
password = db.Column(db.String(100))
email = db.Column(db.String(120), unique=True)

def __init__(self, username, password, email):
self.username = username
self.password = password
self.email = email

def __repr__(self):
return '<User %r>' % self.username

class Piclist(db.Model):
id = db.Column(db.Integer, primary_key=True)
picname = db.Column(db.String(80))
time = db.Column(db.String(80))
status = db.Column(db.Integer)

def __init__(self, picname, time, status):
self.picname = picname
self.time = time
self.status = status

def __repr__(self, picname, time, status):
reurn '<User %r>' % self.picname

我们设置了个类,第一个是User,用于存放用户信息;第二个Piclist用于存放图片信息;

用户信息包括:

  • id:唯一标示,整形。
  • username:用户名,字符串。
  • password:密码,字符串(加密算法暂不考虑)。
  • email:邮箱,字符串。
    照片信息包括:

  • id:唯一标示,整形。

  • picname:照片文件名字,字符串。
  • time:照片拍摄时间,字符串。
  • status:状态(1:正常,2:可疑),整形。

创建数据库

在ssh窗口输入python命令进入python shell,运行下面两行。

1
2
>>>>from monitorDB import db
>>>>db.create_all()

  1. 先导入数据库主函数db
  2. 创建所有的表

向数据库添加用户

继续在shell中操作,也可以单独写个py文件。

1
2
3
4
5
6
>>>>from monitorDB import User
>>>>admin = User('admin','password','[email protected]')
>>>>demo = User('demo','demo','[email protected]')
>>>>db.session.add(admin)
>>>>db.session.add(demo)
>>>>db.session.commit()

  1. 从数据库配置中导入User表配置
  2. 创建两个User
  3. 把这两个User写入数据库
  4. 保存更改(如果不进行这句操作,那么上述添加操作就不会保存在数据库上。

查询记录

查询非常简单,只需要进行User.query.all()操作即可

如果需要查询特定用户,则User.query.filter_by(username='admin').first()

1
2
3
4
5
6
7
>>>>users = User.query.all()
>>>>print usersSql[<User u'admin'>, <User u'demo'>]
>>>>for user in users:
... print user.id, user.username, user.password, user.email
...
1 admin password [email protected]
2 demo demo [email protected]

SQLAlchemy查询结果为对象,如果需要详细信息,则可以使用上述循环来获取详细信息。

删除记录

删除数据库中记录也异常简单,只需要把添加操作中的add换成delete。

1
2
>>>>db.session.delete(demo)
>>>> db.session.commit()

更新记录

官网没有直接给出更新记录的方法,差点走了弯路,其实非常简单,比如我要更新demo用户的邮箱。

1
2
3
>>>>demo = User.query.filter_by(username='demo').first()
>>>>user.email = '[email protected]'
>>>>db.session.commit()