Python Flask学习笔记之数据库

Flask中的数据库#

Flask本身不支持数据库,对使用的数据库插件自由选择。

数据库被划分为两大类,遵循关系模型的一类是关系数据库,另外的则是非关系数据库,简称NoSQL,表现在它们不支持流行的关系查询语言SQL。

使用Flask-SQLAlchemy管理数据库#

Flask-SQLAlchemy是一个Flask扩展,简化了在Flask程序中使用SQLAlchemy的操作。SQLAlchemy是一个很强大的关系型数据库框架,支持包含MySQL、PostgreSQL和SQLite在内的很多数据库软件。

  • 安装
 

Copy

pip install flask-sqlalchemy

  • 常见数据库URL格式
 

Copy

mysql mysql://username:password@hostname/database postgres postgresql://username:password@hostname/database sqlite sqlite:///absolute/path/to/database

  • 配置数据库
 

Copy

# config.py import os basedir = os.path.abspath(os.path.dirname(__file__)) class Config(object): SECRET_KEY = os.environ.get('SECRET_KEY') or 'marksecret' SQLALCHEMY_DATABASE_URI = 'mysql://root:root@localhost/flask' SQLALCHEMY_TRACk_MODIFICATIONS = False SQLALCHEMY_COMMIT_TEARDOWN = True # __init__.py变更后 from flask import Flask from config import Config from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate app = Flask(__name__) app.config.from_object(Config) db = SQLAlchemy(app) migrate = Migrate(app,db) from app import routes,models

模型#

定义数据库中一张表及其字段的类,通常叫做数据模型。ORM(SQLAlchemy)会将类的实例关联到数据库表中的数据行,并翻译相关操作。

 

Copy

mysql> desc user; +---------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | username | varchar(64) | YES | | NULL | | | email | varchar(120) | YES | | NULL | | | password_hash | varchar(128) | YES | | NULL | | +---------------+--------------+------+-----+---------+-------+

代码实现

 

Copy

# models.py from app import db class User(db.Model): id =db.Column(db.String(64), primary_key=True,index=True, unique=True) username = db.Column(db.String(64), index=True, unique=True) email = db.Column(db.String(120), index=True, unique=True) password_hash = db.Column(db.String(128)) def __repr__(self): return '<User {}>'.format(self.username)

测试

 

Copy

>>> from app.models import User >>> u = User(username='mark',email='test@xx.com') >>> u <User mark> >>>

关系#

关系数据库使用关系把不同表中的行联系起来。一旦建立了关系,数据库就可以在查询中展示它。

roles表存储所有可用的用户角色,每个角色使用一个唯一的id值(即表的主键)进行标识。users表除了id主键之外,role_id是外键,引用角色的id,通过这种方式为每个用户指定角色。

示例代码

 

Copy

# hello.py class Role(db.Model): #... users = db.relationship('User',backref='role') class User(db.Model): #... role_id = db.Column(db.Integer,db.ForeignKey('role.id'))

关系使用users表中的外键连接了两行。添加到user模型中的role_id被定义为外键,就是这个外键建立起了关系。传给db.ForeignKey()的参数role_id表明,这列的值是roles表中的id值

db.relationship()第一个参数表明这个关系的另一端是哪个模型。backref参数向user模型中添加了一个role属性,从而定义反向关系。这一属性可替代role_id访问role模型,此时获取的是模型对象,而不是外键的值。

数据库操作#

 

Copy

>>> from app import db >>> from app.models import User # 增加用户mark >>> u = User(id=1,username='mark', email='mark@qq.com') >>> u >>> db.session.add(u) >>> db.session.commit()

 

Copy

>>> user = User.query.all() >>> user [<User mark>] # 增加用户test >>> u2 = User(id=2,username='test', email='test@qq.com') >>> db.session.add(u2) >>> db.session.commit() >>> print user.id 2 >>> print user.email test@qq.com

 

Copy

>>> u2.username u'test' >>> u2.username = 'mark2' >>> db.session.add(u2) >>> db.session.commit() >>> a=User.query.all() >>> a [<User mark>, <User mark2>] >>>

 

Copy

>>> db.session.delete(u2) >>> db.session.commit() >>> a=User.query.all() >>> a [<User mark>] >>>

python shell(shell上下文)#

开发应用时,需要经常在Python shell中测试,所以每次重复导入会变得很繁琐。flask shell命令是flask命令集中的另一个非常有用的工具。

 

Copy

# manage.py from app import app, db from app.models import User, Post @app.shell_context_processor def make_shell_context(): return {'db': db, 'User': User, 'Post': Post}

flask shell的绝妙之处不在于它预先导入了app,而是你可以配置一个“shell上下文”,也就是可以预先导入一份对象列表。

 

Copy

(env) mark@mark-Pc:~/flask$ flask shell >>> User <class 'app.models.User'> >>> db <SQLAlchemy engine=mysql://root:***@localhost:3306/flask?charset=utf8> >>> app <Flask 'app'>

数据库迁移#

  • 安装插件
 

Copy

pip install flask-migrate

  • 创建迁移仓库
 

Copy

flask db init

  • 创建迁移脚本
 

Copy

flask db migrate -m "user table"

  • 更新数据库
 

Copy

flask db upgrade

分类: Python

标签: web开发python

 原文地址:Python Flask学习笔记之数据库 - mark-zh - 博客园

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Python Flask和ECharts连接MySQL数据库的示例: 1. 首先,安装必要的库: ``` pip install flask pip install pymysql pip install echarts ``` 2. 然后,创建一个名为“app.py”的Flask应用程序,并导入必要的库: ```python from flask import Flask, render_template, request import pymysql import json from pyecharts.charts import Bar from pyecharts import options as opts from pyecharts.globals import ThemeType ``` 3. 连接MySQL数据库,并编写查询语句: ```python # 连接MySQL数据库 conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='password', db='database', charset='utf8') # 编写查询语句 sql = "SELECT * FROM table" cursor = conn.cursor() cursor.execute(sql) result = cursor.fetchall() cursor.close() conn.close() # 处理查询结果 data = [] for row in result: data.append({'name': row[0], 'value': row[1]}) ``` 4. 创建ECharts图表,并在Flask应用程序中呈现: ```python # 创建柱状图 bar = ( Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) .add_xaxis([x['name'] for x in data]) .add_yaxis("数据", [y['value'] for y in data]) .set_global_opts(title_opts=opts.TitleOpts(title="数据可视化")) ) # 在Flask应用程序中呈现 app = Flask(__name__) @app.route("/") def index(): return render_template("index.html") @app.route("/data") def get_data(): return json.dumps(data) @app.route("/chart") def get_chart(): return bar.dump_options_with_quotes() if __name__ == "__main__": app.run() ``` 5. 最后,创建一个名为“index.html”的HTML文件,并使用ECharts呈现图表: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>数据可视化</title> <script src="https://cdn.bootcdn.net/ajax/libs/echarts/4.8.0-rc.1/echarts.min.js"></script> </head> <body> <div id="chart" style="width: 800px; height: 600px;"></div> <script> var chart = echarts.init(document.getElementById('chart')); var data = JSON.parse('{{ get_data() }}'); option = {{ get_chart() }}; chart.setOption(option); </script> </body> </html> ``` 这就是一个基本的Python Flask和ECharts连接MySQL数据库的示例。您可以根据实际情况进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值