python Flask-SQLAlchemy操作数据库
来源:互联网 发布:linux使用ss科学上网 编辑:程序博客网 时间:2024/04/29 22:18
数据库URL必须保存到Flask配置对象的SQLALCHEMY_DATABASE_URI键中。将SQLALCHEMY_COMMIT_ON_TEARDOWN键,将其设为True时,每次请求结束后都会自动提交数据库中的变动。
简单的配置SQLite数据库
from flask_sqlalchemy import SQLAlchemybasedir = os.path.abspath(os.path.dirname(__file__))app = Flask(__name__)app.config['SECRET_KEY'] = 'hard to guess string'app.config['SQLALCHEMY_DATABASE_URI'] =\ 'sqlite:///' + os.path.join(basedir, 'data.sqlite')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', lazy='dynamic') def __repr__(self): return '<Role %r>' % self.nameclass 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
tablename定义在数据库中使用的表名。添加到User模型中的role_id列被定义为外键,就是这个外键建立了关系。传给db.ForeignKey()的参数‘role.id’表明,这列的值是roles表中的行的id值。
添加到Role模型中的users属性代表这个关系的面向对象视角。对于一个Role类的实例,其users属性将返回与角色相关联的用户组成的列表。db.relationship()的第一个参数表明这个关系的另一端是那个模型。
db.relationship()中的backref参数向User模型中添加一个role模型,从而定义反向关系。这一属性可替代role_id访问Role模型,此时获取的是模型对象,而不是外键的值。
db.relationship()表示一对一关系时,把uselist设置为False,把多变成一
接下来在flask-script中操作数据库
python hello.py shell
创建表
from hello import dbdb.create_all()db.drop_all()db.create_all()
插入行
from hello import Role, Useradmin_role = Role(name='Admin')mod_role = Role(name='Moderator')user_role = Role(name='User')user_john = User(username='john', role=admin_role)user_susan = User(username='susan', role=user_role)user_david = User(username='david', role=user_role)db.session.add(admin_role)或者可以批量添加到会话中db.session.add_all([admin_role,mod_role,...,user_david])提交给数据库db.session.commit()
修改行
admin_role.name = 'test'db.session.add(admin_role)db.session.commit()
删除行
db.session.delete(mod_role)db.session.commit()
查询行
User.query.filter_by(role=user_role).all()user_role = Role.query.filter_by(name='User').first()
常用的SQLALchemy查询过滤器
在users = db.relationship('User', backref='role', lazy='dynamic')
加入了lazy=’dynamic’参数,从而禁止自动执行查询,user_role.users会返回一个尚未执行的查询,因此可以在其上添加过滤器 user_role.users.order_by(User.username).all()
Flask-SQLAlchemy要求每个模型都要定义主键,这一列经常命名为id
最常用的SQLALCHEMY列选项
集成Python Shell
每次启动Shell会话都要导入数据库实例和模型,可以配置让Flask-script的shell命令自动导入特定的对象
from flask_script import Shelldef make_shell_context(): return dict(app=app, db=db, User=User, Role=Role)manager.add_command("shell", Shell(make_context=make_shell_context))再次执行 python hello.py shell>>> db<SQLAlchemy engine='sqlite:///C:\\Users\\yuchuan\\PycharmProjects\\flasky\\data.sqlite'>>>> app<Flask 'hello'>>>> User<class '__main__.User'>
在视图函数中操作数据库
@app.route('/', methods=['GET', 'POST'])def index(): form = NameForm() if form.validate_on_submit(): #从数据库中查询是否存在 user = User.query.filter_by(username=form.name.data).first() if user is None: user = User(username=form.name.data) db.session.add(user) session['known']=False else: session['known']=True session['name']=form.name.data form.name.data = '' return redirect(url_for('index')) return render_template('index.html', form=form, known=session.get('known', False), name=session.get('name'))
index.html
{% block page_content %}<div class="page-header"> <h1>Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!</h1>{% if not known %}<p>Pleased to meet you !</p>{% else %}<p>Happy to see you again!</p>{% endif %}</div>{{ wtf.quick_form(form) }}{% endblock %}
本文参考《Flask Web开发-基于Python的Web应用开发实战》
- python Flask-SQLAlchemy操作数据库
- Flask sqlalchemy操作数据库
- flask SQLAlchemy 数据库操作
- Flask Sqlalchemy数据库操作例程
- python Flask-SQLAlchemy 连接数据库
- python数据库操作SQLAlchemy
- Flask Web 开发 数据库操作 Sqlalchemy
- Python Flask 中用 SQLAlchemy 访问 Mysql 数据库
- Python:数据库操作模块SQLAlchemy
- Python:数据库操作模块SQLAlchemy
- Python:数据库操作模块SQLAlchemy
- Flask-SQLAlchemy管理数据库
- Flask-sqlalchemy连接数据库
- flask-sqlalchemy 数据基本操作
- flask-SQLALCHEMY 远程连接数据库
- flask-SQLAlchemy数据库密码加密
- python flask SQLAlchemy 的用法
- Python Flask Web 第十一课 —— 使用 Flask-SQLAlchemy 管理数据库
- leetcode 462 Minimum Moves to Equal Array Elements II C++
- 【转载】清华人都如此努力,那我们呢?
- gradle
- .NET MVC4中使用KindEditor文本编辑器 【教程】(网搜加问人)
- 金格插件使用心得
- python Flask-SQLAlchemy操作数据库
- 本机无法连接到虚拟机的服务
- Servlet
- LeetCode 008 StringToInteger(atoi)
- selenium之 定位以及切换frame(iframe)
- http协议内容的简单易懂版概述
- 51nod 1009 数字1的数量
- MongoDB——第三天 细说高级操作
- 【51nod 1201】 整数划分