文章来源—知了课堂的课件
一、SQLAlchemy模型与表映射
注意事项:
- 模型需要继承自
db.Model
,然后需要映射到表中的属性,必须写成db.Column
的数据类型。 - 数据类型:
db.Integer
代表的是整形.db.String
代表的是varchar
,需要指定最长的长度。db.Text
代表的是text
。
- 其他参数:
primary_key
:代表的是将这个字段设置为主键。autoincrement
:代表的是这个主键为自增长的。nullable
:代表的是这个字段是否可以为空,默认可以为空,可以将这个值设置为False
,在数据库中,这个值就不能为空了。
- 最后需要调用
db.create_all
来将模型真正的创建到数据库中。
分析:
SQL语句
create table article (
id int primary key autoincrement,
title varchar(100) not null,
content text not null,
)
python的ORM代码
# 首先继承自db.Model
class Article(db.Model):
__tablename__ = 'article' # 指定一个表名
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
实例:
main.py
# encoding:utf8
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)
# Article表
# create table article (
# id int primary key autoincrement,
# title varchar(100) not null,
# content text not null,
# )
# 创建一个article表,ORM中一个表对应一个类
class Article(db.Model):
__tablename__ = 'article' # 指定一个表名
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
db.create_all()
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)
config.py
# encoding:utf8
# dialect+driver://username:password@host:port/database
DIALECT = 'mysql'
DRIVER = 'mysqldb'
USERNAME = 'root'
PASSWORD = ''
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'db_demo'
# 使用一种Python3的语法将连接数据的各种参数连接起来
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST
, PORT, DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = True
二、SQLAlchemy数据表增删改查
1.增
# 增加:
article1 = Article(title='aaa',content='bbb')
db.session.add(article1)
# 事务
db.session.commit()
2.查
- 查出来的是Query类型的数据,相当于list类型的数据。
方式一:
# 查
# select * from article where article.title='aaa';
article1 = Article.query.filter(Article.title == 'aaa').first() # 包装成Article这样的一个对象,操作时就可以像操作类的对象一样
print 'title:%s' % article1.title
print 'content:%s' % article1.content
方式二:
result = Article.query.filter(Article.title == 'aaa')
print result # 打印的是执行的SQL语句
方式三:
result = Article.query.filter(Article.title == 'aaa').all() # 返回的是一个数组
print result[0] # 打印的是返回的数组的一个元素
article1 = result[0]
print article1.title
print article1.content
3.改
# 改:
# 1. 先把你要更改的数据查找出来
article1 = Article.query.filter(Article.title == 'aaa').first()
# 2. 把这条数据,你需要修改的地方进行修改
article1.title = 'new title'
# 3. 做事务的提交
db.session.commit()
4.删
# 删
# 1. 把需要删除的数据查找出来
article1 = Article.query.filter(Article.content == 'bbb').first()
# 2. 把这条数据删除掉
db.session.delete(article1)
# 3. 做事务提交
db.session.commit()