ORM模型框架flask-sqlachemy封装了所有数据库操作,简单容易上手,学会了后对数据操作将会变得so easy
from flask import Flask from flask_sqlalchemy import SQLAlchemy import config """ MySql-python中间键,驱动(python2) Python3需要安装的MySQL库是mysqlclient ORM:Object Relationship Mapping(模型关系映射) flask-sqlachemy是一套ORM框架 ORM的好处:可以让我们操作数据库跟操作对像是一样,非常方便,因为一个表就抽象成一个类,一条数据就抽象成该类的一个对象 flask-sqlachemy使用 *使用flask-sqlachemy中的SQLAlchemy()进行初始倾听 from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy(app) 设置配置信息 在config.py文件中添加以下配置信息 #dialect+driver://username:password@host:port/database DEALECT = 'mysql' DRIVER = 'mysqldb' USERNAME = 'root' PASSWORD = 'kk1234' HOST = '192.168.0.101' PORT = '3306' DATABASE = 'db_demo1' SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DEALECT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABASE) SQLALCHEMY_TRACK_MODIFICATIONS = False 在主app文件中添加配置文件 app.config.from_object(config) 测试,看有没有问题 db.create_all() 如果没有报错,就没有问题,有如果有错误 ,可以根据错误进行修改 """ app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app) db.create_all() @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run(debug=True) """ 创建模型表 1、模型需要继承自db.Model,然后需要映射到表中的属性,必须写成db.Column的数据类型 2、数据类型: db.Integer代表是整形, db.String代表的是varchar,需要指定长度 db.Text代表的是text 3、其他参数: primary_key: 代表的装饰这个字段设置为主键 autoincrement:代表的是这个主键为自增长的 nullable:代表这个字段是否可以为空,默认可以为空,可以将此值设置为False,就不能为空了、 4、调用db.create_all 来将模型创建到数据库中 """ app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app) class Article(db.Model): __tablename__ = 'article' id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(100), nullable=False) content = db.Column(db.Text, nullable=False) db.create_all() @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run(debug=True) """ 数据的增删改查 增 articles1 = Article(title='aaa', content='bbb') db.session.add(articles1) 查 #result = Article.query.filter(Article.title == 'aaa').all() #first() 查询第一条数据,没有数据就 result = Article.query.filter(Article.title == 'aaa').first() print('title:%s' % result.title) print('content:%s' % result.content) 改 #先把需要更改的数据查找出来 article1 = Article.query.filter(Article.title == 'aaa').first() #把这条数据,需要修改的地方进行修改 article1.title = 'new title' #事条提交 db.session.commit() 删 #先把需要删除的数据查出来 article1 = Article.query.filter(Article.content == 'bbb').first() #把这条数据删除掉 db.session.delete(article1) #事务提交 db.session.commit() """ app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app) class Article(db.Model): __tablename__ = 'article' id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(100), nullable=False) content = db.Column(db.Text, nullable=False) db.create_all() @app.route('/') def hello_world(): #增加 # articles1 = Article(title='aaa', content='bbb') # db.session.add(articles1) # #事物提交 # db.session.commit() #查 #result = Article.query.filter(Article.title == 'aaa').all() #first() 查询第一条数据,没有数据就 # result = Article.query.filter(Article.title == 'aaa').first() # print('title:%s' % result.title) # print('content:%s' % result.content) #改 #先把需要更改的数据查找出来 # article1 = Article.query.filter(Article.title == 'aaa').first() # #把这条数据,需要修改的地方进行修改 # article1.title = 'new title' # #事条提交 # db.session.commit() #删 #先把需要删除的数据查出来 article1 = Article.query.filter(Article.content == 'bbb').first() #把这条数据删除掉 db.session.delete(article1) #事务提交 db.session.commit() return 'Hello World!' if __name__ == '__main__': app.run(debug=True) """ 外键: 一对多 class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(100), nullable=False) class Acricle(db.Model): __tablename__ = 'article' id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(100), nullable=False) content = db.Column(db.Text, nullable=False) author_id = db.Column(db.Integer, db.ForeignKey('user.id')) #ForeignKey 用的是表名 user,不是模型名User author = db.relationship('User', backref=db.backref('articles')) #映射,引用表,反向引用表 #relationship给Article这个模型添加一个author属性,可以访问怕个作者的数据,像访问普通模型一样 #backref是定义反射引用,可以通过‘User.articles’这个模型访问这个作者的所有文章 """ app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app) class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(100), nullable=False) class Acricle(db.Model): __tablename__ = 'article' id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(100), nullable=False) content = db.Column(db.Text, nullable=False) author_id = db.Column(db.Integer, db.ForeignKey('user.id')) #ForeignKey 用的是表名 user,不是模型名User author = db.relationship('User', backref=db.backref('articles')) #映射,引用表,反向引用表 db.create_all() @app.route('/') def hello_world(): #想要添加一篇文章,文章依赖用户,所以添加用户 # user1 = User(username='zhiliao') # db.session.add(user1) # db.session.commit() # article = Acricle(title='aaa', content='bbb', atthor_id=2) # db.session.add(article) # db.session.commit() #我要找文章标题为aaa的作者 # artile = Acricle.query.filter(Acricle.title == 'aaa').first() # author_id = artile.atthor_id # user = User.query.filter(User.id == author_id).first() # print("username: %s" % user.username) # article = Acricle(title='aaa', content='bbb') # article.author = User.query.filter(User.id == 2).first() # db.session.add(article) # db.session.commit() # 我要找文章标题为aaa的作者 # artile = Acricle.query.filter(Acricle.title == 'aaa').first() # print('username: %s' % artile.author.username) #找到用户写过所有的文章 # artile = Acricle(title='222', content='vvv', author_id=2) # db.session.add(artile) # db.session.commit() user = User.query.filter(User.username == 'zhiliao').first() result = user.articles for art in result: print('title: %s' % art.title) print('content: %s' % art.content) return 'Hello World!' if __name__ == '__main__': app.run(debug=True) """ 多对多 多对多要通过一个中间表进行关联,中间表不能通过class实现,只能通过db.Table实现 设置关联 tags = db.relationship('Tag', secondary=article_tab, backref=db.backref('articles')) 需要使用一个关键字参数 secondary = 中间表 来进行关联 访问和数据添加可以通过以下方式进行操作 添加数据 article1 = Article(name='aaa') article2 = Article(name='bbb') tag1 = Tag(name='111') tag2 = Tag(name='222') article1.tags.append(tag1) article1.tags.append(tag2) article2.tags.append(tag1) article2.tags.append(tag2) db.session.add(article1) db.session.add(article2) db.session.add(tag1) db.session.add(tag2) db.session.commit() 访问数据 article1 = Article.query.filter(Article.name == 'aaa').first() tags = article1.tags for tag in tags: print(tag.name) """ app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app) db.create_all() article_tab = db.Table('article_tag', db.Column('article_id', db.Integer, db.ForeignKey('article.id'), primary_key=True), db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True) ) class Article(db.Model): __tablename__ = 'article' id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(100), nullable=False) tags = db.relationship('Tag', secondary=article_tab, backref=db.backref('articles')) class Tag(db.Model): __tablename__ = 'tag' id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(100), nullable=False) db.create_all() @app.route('/') def hello_world(): article1 = Article(name='aaa') article2 = Article(name='bbb') tag1 = Tag(name='111') tag2 = Tag(name='222') article1.tags.append(tag1) article1.tags.append(tag2) article2.tags.append(tag1) article2.tags.append(tag2) db.session.add(article1) db.session.add(article2) db.session.add(tag1) db.session.add(tag2) db.session.commit() article1 = Article.query.filter(Article.name == 'aaa').first() tags = article1.tags for tag in tags: print(tag.name) return 'Hello World!' if __name__ == '__main__': app.run(debug=True)