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. 从 php 源码看 php 中的对象

    从一个简单的例子说起: class Person { public $name; public $age; public function __construct($name, $age) { $th ...

  2. Python如何引入自定义模块?

    Python运行环境在查找库文件时是对 sys.path 列表进行遍历,如果我们想在运行环境中注册新的类库,主要有以下四种方法: 1.在sys.path列表中添加新的路径.这里可以在运行环境中直接修改 ...

  3. lower_bound/upper_bound example

    http://www.cplusplus.com/reference/algorithm/upper_bound/左闭右开 Return iterator to lower bound Returns ...

  4. Python之socket(套接字)补充

    IO多路复用 I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. Linux Linux中的 select,poll,e ...

  5. day2 程序流程控制

    流程控制:1.调用方法.调用方法将导致控制流程离开当前方法,转移到被调用的方法 2.选择.java中有两种做出选择的机制:if/else语句和switch语句.三目运算符可以看作是if/else的一个 ...

  6. PHP运算符的规律

    ^异或的规律:只有真真和假假位假 !非 判断失误的另一名比如true是false &只要有真都为真就是真其他都是假 $$就是左边是真的就不判断了 规律是一样的 |或只有假假都为假其他都是真

  7. 洛谷 p2530 化工场装箱员(资源型)

    化工场装箱员 https://www.luogu.org/problem/show?pid=2530 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的 ...

  8. ZeroMQ API(一) 总序

    序 zeromq是一个轻量级的消息库.它扩展了标准的套接字接口,其特性与传统的消息中间件不同,zeromq提供异步消息队列.多消息传递模式.消息过滤(订阅).无缝访问多个传输协议等的抽象. 本系列AP ...

  9. Java并发编程原理与实战十一:锁重入&自旋锁&死锁

    一.锁重入 package com.roocon.thread.t6; public class Demo { /* 当第一个线程A拿到当前实例锁后,进入a方法,那么,线程A还能拿到被当前实例所加锁的 ...

  10. Java并发编程原理与实战三:多线程与多进程的联系以及上下文切换所导致资源浪费问题

    一.进程 考虑一个场景:浏览器,网易云音乐以及notepad++ 三个软件只能顺序执行是怎样一种场景呢?另外,假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而 ...