linux和mac下需要将项目文件夹赋予权限,不然不能执行
flask中使用Flask-SQLAlchemy扩展来管理程序数据。
修改配置文件 myblog/config.py
CSRF_ENABLED=True SECRET_KEY='you-will-never-guess' import os basedir = os.path.abspath(os.path.dirname(__file__)) SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'app.db') SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir, 'db_repository') SQLALCHEMY_TRACK_MODIFICATIONS=True #db文件创建在与创建脚本同一目录下 # SQLALCHEMY_DATABASE_URI是the Flask-SQLAlchemy必需的扩展。这是我们的数据库文件的路径。 # SQLALCHEMY_MIGRATE_REPO 是用来存储SQLAlchemy-migrate数据库文件的文件夹。 #SQLALCHEMY_TRACK_MODIFICATIONS 不设为True会报错(貌似段代码没有也能正常运行)
修改初始化脚本 app/__init__.py
from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy app=Flask(__name__) app.config.from_object('config') db=SQLAlchemy(app) from app import views,models #导入Flask-SQLAlchemy #创建了一个 db 对象,这是我们的数据库 #导入一个新的模块,叫做 models
编写models模块 app/models.py
from app import db class User(db.Model): id = db.Column(db.Integer, primary_key=True) nickname = db.Column(db.String(64), index=True, unique=True) email = db.Column(db.String(120), index=True, unique=True) posts = db.relationship('Post', backref='author', lazy='dynamic') def __repr__(self): return '<User %r>' % (self.nickname) class Post(db.Model): id = db.Column(db.Integer, primary_key = True) body = db.Column(db.String(140)) timestamp = db.Column(db.DateTime) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) def __repr__(self): return '<Post %r>' % (self.body)
表关系:
#数据模型类要继承db.Model
db.Column( )是创建一列
db.Integer 是整数类型
db.String 是字符串类型
primary_key = True 是主键
index=True 增加索引
unique=True 整表唯一
db.relationship( ),第一个参数是类名,第二个backref名字好像是随便(这个参数是在新增数据时user_id 用 authou 代替 ),第三个固定lazy=‘dynamic‘
db.relationship( )定义主键和外键的联系
db.ForeignKey( )是外键
__repr__方法告诉Python如何打印class对象,方便我们调试使用。
创建数据库 mybolg/db_cj.py
from app import db db.create_all() #create_all( )是创建数据库
执行这个脚本就会创建数据库
测试新增用户 xz_user.py
from app import db, models def add_com (u): db.session.add(u) db.session.commit() u = models.User(nickname='john', email='[email protected]') add_com(u) w=models.User(nickname='susan', email='[email protected]') add_com(w) #session.add( )添加数据 #session.commit( )提交事务
测试新增文章 xz_body.py
import datetime from app import db, models u = models.User.query.get(1) p = models.Post(body='my first post!', timestamp=datetime.datetime.utcnow(), author=u) db.session.add(p) db.session.commit() #authou就是Post数据类里的user_id(应该是的)
测试查询用户 cx_user.py
from app import db, models users = models.User.query.all() print users for u in users : print u.id,u.nickname e=models.User.query.get(1) print e p=models.User.query.filter_by(nickname="john").first() print p.id print p.email d=models.User.query.filter(models.User.email.endswith('@email.com')).all() print d
结果:
[<User u‘john‘>, <User u‘susan‘>]
1 john
2 susan
<User u‘john‘>
1
[email protected]
[<User u‘john‘>, <User u‘susan‘>]
#query这个属性是查询,query.all( )是查询所有
#query.get( )是查询主键
#filter_by( )是单条过滤条件,first( )是选择第一条
#query.filter_by(过滤条件).first( )根据过滤条件查询第一条
#filter( )多条过滤条件
测试查询文章 cx_body.py
from app import db, models u = models.User.query.get(1) print u posts = u.posts.all() print posts e=models.User.query.get(2) print e.posts.all()
结果:
<User u‘john‘>
[<Post u‘my first post!‘>]
[ ]
测试清空数据库 db_qk.py
from app import db, models users = models.User.query.all() for u in users: db.session.delete(u) posts = models.Post.query.all() for p in posts: db.session.delete(p) db.session.commit() #session.delete( )删除