Flask-SQLAlchemy

Flask-SQLAlchemy库让flask更方便的使用SQLALchemy,是一个强大的关系形数据库框架,既可以使用orm方式操作数据库,也可以使用原始的SQL命令.

需要安装的包

MySQL

SQLAlchemy

Flask-SQLAlchemy

mysqlclient

配置Flask-SQLAlchemy

示例:

MySQL:

mysql://username:password@hostname/database

定义模型

from sqlalchemy import Column, Integer, MetaData, VARCHAR
from flask_sqlalchemy import SQLAlchemy
from flask import Flask app = Flask(__name__) #配置数据库地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:wjjf2008@127.0.0.1:3306/internet_plus?charset=utf8'
#该配置为True,则每次请求结束都会自动commit数据库的变动
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True db = SQLAlchemy(app)
#也可以db = SQLAlchemy() db.init_app(app) class User(db.Model): #使用继承至db.Model的类来定义模型
__tablename__ = 'User' #if use Declarative,tablename is needed
user_id = db.Column('user_id', db.Integer, autoincrement=True, primary_key = True)
user_name = db.Column('user_name', db.VARCHAR(20), nullable=False, unique=True, default='')
user_phone = db.Column('user_phone', db.VARCHAR(20), nullable=False, default='')
user_email = db.Column('user_email', db.VARCHAR(30), nullable=False, default='') def __repr__(self):
return '<User %r>' % self.user_name if __name__ == '__main__':
db.create_all() #创建数据库

常用字段选项:

  primary_key 设置主键

  unique 是否唯一

  index 是否创建索引

  nullable 是否允许为空

  default 设置默认值,可以传入函数的引用 如传入 datetime.datetime.utcnow 则每次创建时时间都是最新时间

数据库操作

  • 插入数据
from models2 import User, db
from flask_sqlalchemy import SQLAlchemy #建立一个新用户
u = User();
u.user_name = 'Jeffrey'
u.user_phone = ''
u.user_email = '729957621@qq.com'
#将用户添加到数据库会话中
db.session.add(u)
#将数据库会话中的变动提交到数据库中,如果不Commit,数据库中是没有改动的
db.session.commit()
  • 查找数据
#返回所有用户保存到list中
user_list = User.query.all() #查找username为abc的第一个用户,返回用户实例
user_list = User.query.filter_by(user_name='Jeffrey').first()
  • 删除数据
u = User.query.first()
db.session.delete(u)
db.session.commit()
  • 修改数据
u = User.query.first()
u.username = 'sb'
db.session.commit()

另一种使用数据库的方法

from sqlalchemy import Column, Integer, MetaData, VARCHAR
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from flask.ext.sqlalchemy import SQLAlchemy metadata = MetaData()
Base = declarative_base(metadata=metadata)
db = 'mysql://root:mysqlpassword@127.0.0.1:3306/dbname?charset=utf8' def get_session(): #此处返回一个session
#create_engine() 会返回一个数据库引擎,echo 参数为 True 时,会显示每条执行的 SQL 语句,生产环境下可关闭。
engine = create_engine(db, encoding="utf-8")
#sessionmaker() 会生成一个数据库会话类。这个类的实例可以当成一个数据库连接,它同时还记录了一些查询的数据,并决定什么时候执行 SQL 语句。
mysql_session_maker = sessionmaker(bind=engine)
session = mysql_session_maker()
'''
# 拿到 session 后,就可以执行 SQL 了
session.execute('create database abc')
print(session.execute('show databases').fetchall())
session.execute('use abc')
# 建 user 表的过程略
print
session.execute('select * from user where id = 1').first()
print
session.execute('select * from user where id = :id', {'id': 1}).first()
'''
return session sql_session = get_session() class User(Base):
__tablename__ = 'User' #if use Declarative,tablename is needed
user_id = Column('user_id', Integer, autoincrement=True, primary_key = True)
user_name = Column('user_name', VARCHAR(20), nullable=False, unique=True, default='')
user_phone = Column('user_phone', VARCHAR(20), nullable=False, default='')
user_email = Column('user_email', VARCHAR(30), nullable=False, default='') if __name__ == '__main__':
#定义一个表
engine = create_engine(db, encoding="utf-8", echo=True)
Base.metadata.create_all(engine)
print(sql_session.query(User).count())

Flask官方文档:http://docs.jinkan.org/docs/flask/

Flask SQLAlchemy & model的更多相关文章

  1. flask SQLAlchemy中一对多的关系实现

    SQLAlchemy是Python中比较优秀的orm框架,在SQLAlchemy中定义了多种数据库表的对应关系, 其中一对多是一种比较常见的关系.利用flask sqlalchemy实现一对多的关系如 ...

  2. flask, SQLAlchemy, sqlite3 实现 RESTful API 的 todo list, 同时支持form操作

    flask, SQLAlchemy, sqlite3 实现 RESTful API, 同时支持form操作. 前端与后台的交互都采用json数据格式,原生javascript实现的ajax.其技术要点 ...

  3. Flask – SQLAlchemy成员增加

    目录 简介 结构 展示 技术 运行 代码 创建数据库表单 views视图 home主页 添加成员addnew.html 展示页show_all 简介 结构 $ tree -I "__pyca ...

  4. flask建表遇到的错误: flask,sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1071, 'Specified key was too long; max key length is 767 bytes')

    error:flask,sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1071, 'Specifie ...

  5. Flask+SQLAlchemy+alembic+Flask-RESTful使用

    前言 其实准备把这篇删掉,先写Flask-restful相关的,后来想想大体框架还是先写出来,这两天踩了很多坑,有的谷歌也没有答案.一直摸索也总算是开始了. 正文 SQLAlchemy/alembic ...

  6. flask SQLALchemy外键及约束

    from flask import Flask,session from flask_sqlalchemy import SQLAlchemy import config app = Flask(__ ...

  7. python3 + flask + sqlalchemy +orm(3):多对多关系

    一篇文章有多个tag,一个tag也可以属于多篇文章,文章和tag存在多对多关系 config.py DEBUG = True #dialect+driver://root:1q2w3e4r5t@127 ...

  8. python3 + flask + sqlalchemy +orm(2):数据库中添加表

    往数据库中添加一张保存文章的表,表明为article,字段有id,title,content 同样一个配置文件:config.py DEBUG = True #dialect+driver://roo ...

  9. Python利用flask sqlalchemy实现分页效果

    Flask-sqlalchemy是关于flask一个针对数据库管理的.文中我们采用一个关于员工显示例子. 首先,我们创建SQLALCHEMY对像db. from flask import Flask, ...

随机推荐

  1. D. Petya and Array 树状数组

    题意: 给出一个数组,元素有正有负有0,问其区间和小于 t 的子区间的个数. sum[ r ]-sum[ l-1 ]<t,其中sum是a的前缀和. 实现的方法就是从前往后对于每一个sum[ i ...

  2. OpenJudge1001Exponentiation

    问题描述 Problems involving the computation of exact values of very large magnitude and precision are co ...

  3. kubernetes 之ingress

    www.cnblogs.com/hellojackyleon/p/8420911.html apiVersion: extensions/v1beta1 kind: Deployment metada ...

  4. PHP变量的传值和引用

    问题: 1.PHP变量的存储.取值方式如何? 2.变量赋值时,普通传值和引用传值分别是什么意思?有何区别? 3.unset被赋值的变量会对两种赋值后原值和新值的影响?   变量的存储.取值形式: 变量 ...

  5. Excel 中 VLOOKUP() 函数小结

    应用场景: 数据仓库上游源系统的数据库表变更,现在需要拆分一部分数据出来,单独放到一张新表中.假设原表为A,新表为B,B表和A表结构大部分一样,只有字段的前缀不同,那么我们如何找出到底有哪些字段不同呢 ...

  6. 【记录】css样式

    记录css的样式设置,方便以后使用. 1.绝对定位,自适应父级大小css: .search-icon-delete { background: url('../../assets/images/sea ...

  7. Android 利用 gson 将 json 转成 对象object 集合list

    1.build.gradle 中引入gson compile 'com.google.code.gson:gson:2.8.5' 2.将后台返回的json数据转对象.List.时间格式与后台返回的时间 ...

  8. ConcurrentHashMap 产生NullPointerException

    今天测试在发给我一段报错日志后,根据日志定位到从ConcurrentHashMap 的缓存中get的时候,ConcurrentHashMap的底层抛出了空指针,当时感觉很奇怪为什么在get的时候产生空 ...

  9. 【学习DIV+CSS】1. 你必须知道的三个知识

    1. DIV+CSS的叫法不够严谨 我们以前做页面布局的时候大多是用Table,很多人称之为“Table+CSS”,而现在比较流行的是DIV布局,所以称之为“DIV+CSS”.听起来是挺合理的,岂不知 ...

  10. Spring Boot后台启动不打印nohup.out

    #!/bin/bashnohup java -jar websocket-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod --serve ...