鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 编程语言开发 > erlang > >

flask笔记:5:数据库

来源:互联网 作者:佚名 时间:2016-05-12 15:57
linux和mac下需要将项目文件夹赋予权限,不然不能执行 flask中使用Flask-SQLAlchemy扩展来管理程序数据。 修改配置文件 myblog/config.py CSRF_ENABLED=TrueSECRET_KEY=you-will-never-guessimport osbasedir = os.path.abspath(os.path.dirname(__file__))S
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='john@email.com')
add_com(u)
w=models.User(nickname='susan', email='susan@email.com')
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 john@email.com [<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( )删除




上一篇:Spring事务配置实例
下一篇:HashMap面试题
网友评论
<