- ORM对象关系映射
- 数据库配置
- 创建数据库模型
- 操作数据库
- 插入数据
- 一对多查询
- 数据更新
- 数据删除
ORM=对象关系映射
英文名称为Object-Relational-Mapping,它提供了概念性的,易于理解的模型化数据的方法。Flask-SQLAlchemy就是一个ORM模块。应用在Flask中使得操作数据库非常方便
ORM 把数据库映射成为对象:
- 数据库的表(table) --> 类(class)
- 表的记录(record,行数据) --> 对象(Object)
- 字段(field) --> 对象的属性(attribute)
数据库配置
在Flask中可以连接各种数据库,这里使用用于开发调试的sqlite数据库和MySQL数据库,其他的例如PostgreSQL或者Oracle也可以。下面列出详细的数据库连接字符串:
连接字符串格式
dialect+driver://username:password@host:port/database
常用数据库连接字符串
Postgres:
postgresql://scott:tiger@localhost/mydatabase
MySQL:
mysql://scott:tiger@localhost/mydatabase
Oracle:
oracle://scott:tiger@127.0.0.1:1521/sidname
SQLite (note that platform path conventions apply):
#Unix/Mac (note the four leading slashes)
sqlite:absolute/path/to/foo.db
#Windows (note 3 leading forward slashes and backslash escapes)
sqlite:///C:\\absolute\\path\\to\\foo.db
#Windows (alternative using raw string)
r'sqlite:///C:\absolute\path\to\foo.db'
例如有数据库配置文件app.py:
SQLALCHEMY_DATABASE_URI = 'mysql://root:123@localhost:3306/myinstagram'
# SQLALCHEMY_DATABASE_URI = 'sqlite:///../myinstagram.db'
# remove FSADeprecationWarning:
SQLALCHEMY_TRACK_MODIFICATIONS = True
官方配置文档可以查看连接:
https://flask-sqlalchemy.palletsprojects.com/en/2.x/config/#connection-uri-format
创建数据库模型
根据ORM基本原理,操作数据库就是操作内存中的对象,创建的数据库模型如下:
#!/usr/bin/env python3
# -*-encoding:UTF-8-*-
from datetime import datetime
from myinstagram import db
import random
class Comment(db.Model):
id = db.Column(db.INTEGER, primary_key=True, autoincrement=True)
content = db.Column(db.String(1024))
image_id = db.Column(db.INTEGER, db.ForeignKey('image.id'))
user_id = db.Column(db.INTEGER, db.ForeignKey('user.id'))
status = db.Column(db.INTEGER, default=0) # 正常情况是0,否则是1
user = db.relationship('User')
def __init__(self, content, image_id, user_id):
"""
status 是不用初始化的,因为默认是0了
:param content:
:param image_id:
:param user_id:
"""
self.content = content
self.image_id = image_id
self.user_id = user_id
def __repr__(self):
# 默认的输出方法
return '<Comment: %d %d>' % (self.id, self.status)
class Image(db.Model):
id = db.Column(db.INTEGER, primary_key=True, autoincrement=True)
url