python框架-flask-10数据库的交互教程
一:关系型数据库 mysql
Flask-SQLAlchemy管理关系型数据库。
mysql数据库引擎:url : mysql://username:passowrd@hostname/database
安装相关依赖包:
pip install flask-sqlalchemy
pip install flask-mysqldb 如果使用mysql数据库需要安装这个依赖包<br></br>
数据库连接配置:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE"] = "mysql://root:[email protected]:3306/flaskmysqltest" <strong># 配置数据库的链接</strong>
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True <strong># 请求结束后自动提交数据库的变动</strong>
app.config['SQLALCHEMY_ECHO'] = True <strong># 执行后显示原始sql语句</strong>
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:[email protected]: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) <strong># create table roles(id int(64) primary key, name varchar(64) unique);</strong>
name = db.Column(db.String(64),unique=True) <strong># desc roles;
</strong>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") <strong> # us这个字段,关联了User类(要写类名):backref="role"表明User类中可以反向引用role对象。
</strong>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")) <strong># role_id 是关联了roles表的id字段。
</strong>def __repr__(self):
return "<User %s>" % self.username<br></br><br></br><strong># 一对多的关系:一个role可以对应多个user用户。</strong>
插入数据:
报错:'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) <strong># 错误一:db在app.config之后设置,应该为之前设置。</strong>
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:[email protected]:3306/flaskmysqltest" <strong># 错误二:</strong><strong>SQLALCHEMY_DATABASE_URI不是URL</strong>
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = False <strong>#</strong><strong>SQLALCHEMY_COMMIT_ON_TEARDOWN 键,将其设为True时,每次请求结束后都会自动提交数据库中的变动</strong>
app.config['SQLALCHEMY_ECHO'] = True
if __name__ == '__main__':
app.run(debug=True)
db.create_all() <strong># 执行所有的类,进行建表。roles 和 user表创建成功。</strong>
r1 = Role(name="admin") <strong># 给roles表中插入数据</strong>
db.session.add(r1)
db.session.commit()<br></br><br></br><img alt="python框架-flask-10数据库的交互教程" src="https://www.icode9.com/i/l/?n=18&i=blog/1749518/201910/1749518-20191024150127381-642346639.png"></img><br></br><br></br><img alt="python框架-flask-10数据库的交互教程" src="https://www.icode9.com/i/l/?n=18&i=blog/1749518/201910/1749518-20191024150402002-80655173.png"></img><br></br>
删除所有的表
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()<br></br><img alt="python框架-flask-10数据库的交互教程" src="https://www.icode9.com/i/l/?n=18&i=blog/1749518/201910/1749518-20191024161834581-2014112120.png"></img><br></br>
再次执行删除所有的表
if __name__ == '__main__':
app.run(debug=True)
db.drop_all()
db.session.commit()
但是结果:表依然没有删除掉<br></br><img alt="python框架-flask-10数据库的交互教程" src="https://www.icode9.com/i/l/?n=18&i=blog/1749518/201910/1749518-20191024162030530-450054662.png"></img><br></br>到底是什么原因呢?<br></br><br></br><strong>解决办法</strong>:重新启动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()<br></br>问题:只执行了创表语句,插入语句没有执行,什么原因?是不是因为要db.create_all()也要用db.session.commit()<br></br><br></br>
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()<br></br>更改后:依然只能执行建表语句,插入数据不成功,到底是什么原因呢?原因是列表 db.session.add_all([r1,r2])没有加列表。然后还是要重启,框架插入语句才能被查询到。