flask ORM模型框架flask-sqlachemy 学习笔记

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魂尾ac

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值