首页 > 数据库技术 > 详细

python框架-flask-10数据库的交互

时间:2019-10-24 19:55:05      阅读:153      评论:0      收藏:0      [点我收藏+]

一:关系型数据库 mysql

  Flask-SQLAlchemy管理关系型数据库。

  mysql数据库引擎:url : mysql://username:passowrd@hostname/database

  安装相关依赖包

    pip install flask-sqlalchemy

    pip install flask-mysqldb  如果使用mysql数据库需要安装这个依赖包

  数据库连接配置

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE"] = "mysql://root:mysql@127.0.0.1:3306/flaskmysqltest"  # 配置数据库的链接
app.config[SQLALCHEMY_COMMIT_ON_TEARDOWN] = True  # 请求结束后自动提交数据库的变动
app.config[SQLALCHEMY_ECHO] = True # 执行后显示原始sql语句

db = SQLAlchemy(app)

@app.route("/user")
def user():
    pass

if __name__ == __main__:
    app.run()

 

 

二:数据库模型 orm

  object-relationship-map 对象关系映射,简答说:就是通过创建实例对象==相当于在数据库中映射了一张表。

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE"] = "mysql://root:mysql@127.0.0.1:3306/flaskmysqltest"
app.config[SQLALCHEMY_COMMIT_ON_TEARDOWN] = True
app.config[SQLALCHEMY_ECHO] = True

db = SQLAlchemy(app)

@app.route("/user")
def user():
    pass


# 定义对象
class Role(db.Model):
    # 类变量定义了数据库中的表名。如果没有指定,会已类的名称小写为表名,也就是role
    __tablename__ = "roles"
    id = db.Column(db.Integer,primary_key=True)  # create table roles(id int(64) primary key, name varchar(64) unique);
    name = db.Column(db.String(64),unique=True)  # desc roles; 
    def __repr__(self):
        return "<Role %s>" % self.name


class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True,index=True)
    def __repr__(self):
        return "<User %s>" % self.username

if __name__ == __main__:
    app.run()

 

   外键和关联的创建

# 定义对象
class Role(db.Model):
    # 类变量定义了数据库中的表名。如果没有指定,会已类的名称小写为表名,也就是role
    __tablename__ = "roles"
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(64),unique=True)
    us = db.relationship("User",backref="role")  # us这个字段,关联了User类(要写类名):backref="role"表明User类中可以反向引用role对象。
    
    def __repr__(self):
        return "<Role %s>" % self.name


class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True,index=True)
    role_id = db.Column(db.Integer,db.ForeignKey("roles.id"))  # role_id 是关联了roles表的id字段。

    def __repr__(self):
        return "<User %s>" % self.username

# 一对多的关系:一个role可以对应多个user用户。

 

  插入数据:

  报错:‘Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. ‘

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app) # 错误一:db在app.config之后设置,应该为之前设置。
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:mysql@127.0.0.1:3306/flaskmysqltest" # 错误二:SQLALCHEMY_DATABASE_URI不是URL
app.config[SQLALCHEMY_COMMIT_ON_TEARDOWN] = False   #SQLALCHEMY_COMMIT_ON_TEARDOWN 键,将其设为True时,每次请求结束后都会自动提交数据库中的变动
app.config[SQLALCHEMY_ECHO] = True

 

 

if __name__ == __main__:
    app.run(debug=True)
    db.create_all()  # 执行所有的类,进行建表。roles 和 user表创建成功。
    r1 = Role(name="admin") # 给roles表中插入数据
    db.session.add(r1)
    db.session.commit()

技术分享图片

技术分享图片

 

   删除所有的表

app.config[SQLALCHEMY_COMMIT_ON_TEARDOWN] = True 将这个从False改为True,请求后数据库自动提交数据变动,要不然删除不成功

if __name__ == ‘__main__‘:
  app.run(debug=True)
  db.drop_all() # 删除所有的表
  db.session.commit() 

技术分享图片

 

 再次创建所有表

if __name__ == __main__:
    app.run(debug=True)
    db.create_all()
    db.session.commit()
技术分享图片

 

 再次执行删除所有的表

if __name__ == __main__:
    app.run(debug=True)
    db.drop_all()
    db.session.commit()

但是结果:表依然没有删除掉
技术分享图片
到底是什么原因呢?

解决办法:重新启动flask框架,后再次执行后,才能实现删除表。

 

注意:重新建表和插入数据,也得重启flask框架才能生效。

if __name__ == __main__:
    app.run(debug=True)
    db.create_all()
    r1 = Role("admin")
    r2 = Role("no_admin")
    db.session.add_all([r1, r2])
    db.session.commit()
问题:只执行了创表语句,插入语句没有执行,什么原因?是不是因为要db.create_all()也要用db.session.commit()

if __name__ == __main__:
    app.run(debug=True)
    db.create_all()
    db.session.commit()
    r1 = Role(name="admin")
    r2 = Role(name="noadmin")
    db.session.add_all(r1,r2)
    db.session.commit()
更改后:依然只能执行建表语句,插入数据不成功,到底是什么原因呢?原因是列表 db.session.add_all([r1,r2])没有加列表。然后还是要重启,框架插入语句才能被查询到。

全部的问题:框架运行到app.run()就阻塞了,当关闭框架时,会执行到,后面的语句,语句才生效,我太笨了。

 

python框架-flask-10数据库的交互

原文:https://www.cnblogs.com/meloncodezhang/p/11733751.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!