我是靠谱客的博主 甜甜棒球,最近开发中收集的这篇文章主要介绍Flask之SQLAlchemy操作mysql,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

      • 安装
      • 基本操作
        • 一、连接数据库
        • 二、创建所有表
        • 三、删除所有表
        • 四、插入行
        • 五、更新行
        • 六、删除行
        • 七、查询表
      • 集成到项目中

这里我们来学习下python操作mysql。以下环境都是在Ubuntu 18.04当中。

flask使用SQLAlchemy来操作mysql。

安装

首先我们要安装mysql-python

pip install mysql-python

如果出现如下错误:

sh: 1: mysql_config: not found
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-GOmOTT/mysql-python/setup.py", line 17, in <module>
        metadata, options = get_config()
      File "setup_posix.py", line 43, in get_config
        libs = mysql_config("libs_r")
      File "setup_posix.py", line 25, in mysql_config
        raise EnvironmentError("%s not found" % (mysql_config.path,))
    EnvironmentError: mysql_config not found

则需要安装libmysqlclient-dev

sudo apt-get install libmysqlclient-dev

然后我们再安装SQLAlchemy:

pip install flask-sqlalchemy

这样后我们就可以用python来操作mysql 了。

基本操作

我们来个最简单的基本操作:

# 文件名test.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hardtoguessstring'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:password@localhost:3306/testdb'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
class Role(db.Model):
    __tablename__ = 'roles' # 数据库表名,如果不指定,则会生成默认的,最好指定
    id = db.Column(db.Integer, nullable=False, primary_key=True, autoincrement=True)
    name = db.Column(db.String(16), nullable=False, server_default='', unique=True)
    def __repr__(self):
        return '<Role %r>' % self.name
class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, nullable=False, primary_key=True, autoincrement=True)
    username = db.Column(db.String(32), nullable=False, unique=True, server_default='', index=True)
    role_id = db.Column(db.Integer, nullable=False, server_default='0')
    def __repr__(self):
        return '<User %r,Role id %r>' %(self.username,self.role_id)

然后我们手动在数据库中创建一个testdb的数据库,再运行这个文件即可看到testdb中生成了roles,users表。

一、连接数据库

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:password@host:port/dbname'

二、创建所有表

python
>>> from hello import db,Role,User
>>> db.create_all()

三、删除所有表

python
>>> from hello import db,Role,User
>>> db.drop_all()

四、插入行

# 插入单行
python
>>> from hello import db,Role,User
>>> db.session.add(Role(name='Admin'))
>>> db.session.commit()
>>> db.session.add(Role(name='Moderator'))
>>> db.session.add(Role(name='User'))
>>> db.session.commit()

# 插入多行
python
>>> from hello import db,Role,User
>>> db.session.add_all([User(username='john',role_id=1),User(username='susan',role_id=3),User(username='david',role_id=3)])
>>> db.session.commit()

五、更新行

python
>>> from hello import db,Role,User
>>> admin = Role.query.filter_by(name='Admin').first()
>>> admin.name='Administrator'
>>> db.session.commit()

六、删除行

python hello.py shell
>>> from hello import db,Role,User
>>> mod = Role.query.filter_by(name='Moderator').first()
>>> db.session.delete(mod)
>>> db.session.commit()

七、查询表

  • 查询表中全部数据

    
    # 注意,此处的查询结果完全取决于代码示例中的
    
    
    # def __repr__(self)
    
    
    # 这段函数,请各位同学注意
    
    python
    >>> from hello import db,Role,User
    >>> Role.query.all()
    [<Role u'Administrator'>, <Role u'User'>]
    >>> User.query.all()
    [<User u'john',Role id 1L>, <User u'susan',Role id 3L>, <User u'david',Role id 3L>]
    
  • 按照一个条件过滤数据记录(where)

    python
    >>> from hello import db,Role,User
    >>> Role.query.filter_by(name='Administrator').first()
    <Role u'Administrator'>
    >>> User.query.filter_by(role_id=3).all()
    [<User u'susan',Role id 3L>, <User u'david',Role id 3L>]
    >>> User.query.filter_by(role_id=3).first()
    <User u'susan',Role id 3L>
    
  • 按照两个条件过滤数据记录(where and)

    python
    >>> from hello import db,Role,User
    >>> User.query.filter_by(role_id=3,username='susan').first()
    <User u'susan',Role id 3L>
    >>> User.query.filter_by(role_id=3,username='susan').all()
    [<User u'susan',Role id 3L>]
    
  • 聚合(count)

    python hello.py shell
    >>> from hello import db,Role,User
    >>> User.query.filter_by(role_id=3,username='susan').count()
    1L
    >>> User.query.filter_by(role_id=3).count()
    2L
    >>> User.query.count()
    3L
    
  • 求和(sum)

    python hello.py shell
    >>> from hello import db,Role,User
    >>> from sqlalchemy.sql import func
    >>> User.query.with_entities(func.sum(User.id)).all()
    [(Decimal('6'),)]
    >>> User.query.with_entities(func.sum(User.role_id)).all()
    [(Decimal('7'),)]
    
  • 平均数(avg)

    python
    >>> from hello import db,Role,User
    >>> from sqlalchemy.sql import func
    >>> User.query.with_entities(func.avg(User.role_id)).all()
    [(Decimal('2.3333'),)]
    >>> User.query.with_entities(func.avg(User.id)).all()
    [(Decimal('2.0000'),)]
    
  • 排序(order by)

    python
    >>> from hello import db,Role,User
    
    # 升序(asc)
    
    >>> User.query.order_by(User.role_id).all()
    [<User u'john',Role id 1L>, <User u'susan',Role id 3L>, <User u'david',Role id 3L>]
    
    # 降序(desc)
    
    >>> User.query.order_by(User.role_id.desc()).all()
    [<User u'susan',Role id 3L>, <User u'david',Role id 3L>, <User u'john',Role id 1L>]
    
  • 分组(group by)

    python hello.py shell
    >>> from hello import db,Role,User
    >>> User.query.group_by(User.role_id).all()
    [<User u'john',Role id 1L>, <User u'susan',Role id 3L>]
    
  • 限制(limit)

    python
    >>> from hello import db,Role,User
    >>> User.query.all()
    [<User u'john',Role id 1L>, <User u'susan',Role id 3L>, <User u'david',Role id 3L>]
    
    # limit 1
    
    >>> User.query.limit(1).all()
    [<User u'john',Role id 1L>]
    
    # limit 2,1
    
    >>> User.query.limit(1).offset(2).all()
    [<User u'david',Role id 3L>]
    >>> User.query.filter_by(role_id=3).all()
    [<User u'susan',Role id 3L>, <User u'david',Role id 3L>]
    
    # limit 1
    
    >>> User.query.filter_by(role_id=3).limit(1).all()
    [<User u'susan',Role id 3L>]
    
    # limit 1,1
    
    >>> User.query.filter_by(role_id=3).limit(1).offset(1).all()
    [<User u'david',Role id 3L>]
    

集成到项目中

实际情况中我们不可能在一个文件中写上n多个数据表类,肯定都是分开的,这样就有了Role.py、User.py这样的类出现,然而你发现创建他们需要db这个对象,而上面的代码中SQLAlchemy创建时候需要传入的初始化的app,这就矛盾了。

事实是SQLAlchemy创建时候可以不传入app,初始化时候再传入app进行赋值初始化即可。

所以正常步骤如下:

  • 1、首先在foundation.py中初始化一个db = SQLAlchemy()这样是为了整个项目中只有这一个数据库对象。

  • 2、在数据库表对象中引入这个db,集成db.Model,生成数据表对象。

  • 3、在初始化项目时候,引入这个db,然后初始化app,并创建数据库表。

    db.app = app
    db.init_app(app)
    db.create_all()

数据库的创建操作只需要执行一次即可,所以这里我们再使用另外的一个库来操作数据库的初始化,这里使用Flask-Script来进行一些简单的操作。

Flask-Script 是一个 Flask 扩展,为 Flask 程序添加了一个命令行解析器。Flask-Script 自带了一组常用选项,而且还支持自定义命令。

我们经常用Flask-Script来执行一些在flask之外的代码,比如开发时候,我需要创建一个测试的数据库,或者清空数据库,或者我可以根据实际情况来启动开发版还是正式版。

我们来看一个简单的例子:

from flask_script import Manager
from flask import Flask
app = Flask(__name__)

manager = Manager(app)

@manager.command
def createall():
    db.create_all()
    db.session.commit()

上面这个例子中,creatall这个函数被加了@manager.command语句,这样我即可以在python中直接运行该方法:

python app.py creatall

执行如上语句后,数据库中的表即可被创建,这样就不用每次我们在app初始化后去都去创建数据库表了。
flask-script还有很多用处,感兴趣的同学可以自行去学习下。

参考:https://wing324.github.io/2017/02/25/%E4%BD%BF%E7%94%A8flask-sqlalchemy%E7%8E%A9%E8%BD%ACMySQL/

最后

以上就是甜甜棒球为你收集整理的Flask之SQLAlchemy操作mysql的全部内容,希望文章能够帮你解决Flask之SQLAlchemy操作mysql所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部