根据知了传课进行学习,记录学习笔记
安装完后在终端并不能识别 mysql 命令,需要配置一下
$ cd /usr/local/bin/
$ sudo ln -fs /usr/local/mysql/bin/mysql mysql
$ mysql --version
#能显示 mysql 版本说明 mysql 安装成功
1、SQLAlchemy:是一个独立的ORM框架,可以独立于Flask存在,也可以在其他项目中使用,比如在Django中
2、Flask-SQLAlchemy:对SQLAlchemy的一个封装,能够更适合在flask中使用
安装和验证:
1、安装:pip install flask-sqlalchemy
2、安装连接数据库的库:pip install pymysql
连接数据库
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'zl_flask'
USERNAME = 'root'
PASSWORD = '999999'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
@app.route('/')
def hello_world(): # put application's code here
#写一个测试代码是否连接成功
engine = db.get_engine()
with engine.connect() as conn:
result = conn.execute("select 1")
print(result.fetchone())
# conn = engine.connect()
# conn.close()
return 'Hello World!'
if __name__ == '__main__':
app.run()
ORM模型是数据库的表和简单java对象的映射关系模型
类与数据库中表的映射;
对象与表中记录的映射;
类的属性与数据库中表的字段的映射。
1、添加操作
#创建记录
article = Article(title="蒙娜丽莎", content="毕加索")
db.session.add(article)
1、做一个提交操作
db.session.commit()
2、查询操作
article = Article.query.filter_by(id=1)[0]
print(article.title)
3、修改数据
article = Article.query.filter_by(id=1)[0]
article.content = "修改"
db.session.commit()
4、删除数据
Article.query.filter_by(id=1).delete()
db.session.commit()
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(200), nullable=False)
class Article(db.Model):
__tablename__ = "article"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(200), nullable=False)
content = db.Column(db.Text, nullable=False)
# 外键:
# 1、外键的类型一定要看索引用字段的类型
# 2、db.ForeignKey("user.id")为"表名.字段名"(表名为__tablename__,字段名为id;username)
# 3、外键是属于数据库层面的,不推荐直接在ORM中使用
author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
# 我们使用relationship描述表之间的关系,用户User与书籍article是一对多的关系
#1、第一个参数"User"是模型User,必须和模型的名字保持一致
#2、backref(back reference):代表反向引用,代表对方访问我的时候的字段名称
#3、必须要有外键相连
author = db.relationship("User",backref="articles")
db.drop_all()
db.create_all()
测试函数
@app.route('/otm')
def one_to_many():
article = Article(title="111",content="xxx")
user = User(username="zhiliao")
article.author = user
#外键
db.session.add(article)
db.session.commit()
return "one to many数据操作成功"
将用户不常用的数据存放在UserExtension中
与用户User的关系为一对一
一对一关系主要在relationship中设置uselist参数为False
class UserExtension(db.Model):
__tablename__ = "user_extension"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
school = db.Column(db.String(100))
user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
# db.backref
# 1、在反向引用时,如果还需要传递一些其他的参数,那么就需要使用到这个函数,否则不需要使用,只要在relationship的backref参数上,设置反向引用的名称就可以了。
# 2、uselist=False:代表反向引用的时候,不是一个列表,而是一个对象
user = db.relationship("User", backref=db.backref("extension", uselist=False))
测试函数
@app.route("/oto")
def one_to_one():
user = User(username="zzqq")
extension = UserExtension(school="dhu")
user.extension = extension
db.session.add(user)
db.session.commit()
return "one to one"