概述
-
-
- 安装
- 基本操作
- 一、连接数据库
- 二、创建所有表
- 三、删除所有表
- 四、插入行
- 五、更新行
- 六、删除行
- 七、查询表
- 集成到项目中
-
这里我们来学习下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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复