flask数据库管理

1.SQL数据库与NoSQL数据库

SQL数据库由不同的表组成,表和表之间由关系连接。每个表中存在一列主键,主表中的某列可用其他表的主键表示,这样的关系构成关系型数据库。

NoSQL数据库即Not Only SQL,存在不同类型的NoSQL。

2.Flask - SQLAlchemy

(1)初始化

这里我们还是使用SQLAlchemy数据库。

(venv) $pip install flask-sqlalchemy

在Index.py中配置数据库

from flask_sqlalchemy import SQLAlchemy

basedir = os.path.abspath(os.path.dirname(__file__))

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True

db = SQLAlchemy(app)

数据库中的表用类定义,各个属性即为表的列,各个实例即为表的行:

class User(db.Model)
    __tablename__ = 'users‘ , 
    id = db.Colomn(db.Integer , primary_key = True)
    username = db.Colomn(db.String(64) , unique = True , index = True)
    role_id = db.Colomn(db.Integer, db.ForeignKey('roles.id')) 
    def __repr__:
        return '<User %r>' % self.username

其中继承db.colomn的变量即为表中的列,示例中定义主键为id,id数据类型为数值型,username列的值不能重复且建立索引,role_id是外键且连接表名为roles的表的id列。

class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Colomn(db.Integer , primary_key  = True)
    name = db.Colomn(db.String(64) , unique = True)
    users = db.relationship('User' , backref = 'role')
    def __repr__:
        return '<Role %r>‘ % self.name

此处一个角色很可能有多个用户与其对应,因此其实是一个一对多关系。relationship方法第一个参数设定与其连接的表对应的类,第二个参数backref将在User类中添加role属性,此处role属性可替代role_id的作用,注意此时获取的不是外键的值,而是该实例整体。

在建立了表的基本结构之后,我们在shell中创建表:

(venv) $ python hello.py shell
>>> from hello import db
>>> db.creat_all()

(2)输入数据

>>> from hello import Role,User
>>> admin_role = Role(name = 'Admin')
>>> mod_role = Role(name = 'Moderator')
>>> user_role = Role(name = 'User')
>>> user_John = User(username = 'John', role = admin_role)
>>> user_Susan = User(username = 'Susan', role = user_role) >>> user_David = User(username = 'David'), role = user_role)

但此时数据尚未写入数据库,只存在与Python中:

>>> print(admin_role.id)
None

首先写入数据库会话

>>> db.session.add(admin_role)
>>> db.session.add(mod_role)

... ...  

>>> db.session.add_all([admin_role,mod_role,user_role,user_John,user_Susan,user_David])

提交会话(保存到数据库):

>>> db.session.commit()

(3)编辑数据

修改数据即将数据重新提交一遍:

>>> admin_role.name = ‘Administrator'
>>> db.session.add(admin_role)
>>> db.session.commit()

删除数据:

>>> db.session.delete(mod_rate)
>>> db.session.commit()

-

猜你喜欢

转载自www.cnblogs.com/icetouch/p/8948119.html