zoukankan      html  css  js  c++  java
  • SQLAlchemy介绍

     相关链接:

    https://blog.csdn.net/zd0303/article/details/50470162 

    https://blog.csdn.net/abcd1f2/article/details/51395561

    https://www.jb51.net/article/49789.htm

     

    Flask-SQLAlchemy安装及设置

    • SQLALchemy 实际上是对数据库的抽象,让开发者不用直接和 SQL 语句打交道,而是通过 Python 对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升
    • SQLAlchemy是一个关系型数据库框架,它提供了高层的 ORM 和底层的原生数据库的操作。flask-sqlalchemy 是一个简化了 SQLAlchemy 操作的flask扩展。
    • 文档地址:http://docs.jinkan.org/docs/flask-sqlalchemy

    安装

    • 安装 flask-sqlalchemy
    pip install flask-sqlalchemy
    
    • 如果连接的是 mysql 数据库,需要安装 mysqldb 驱动
    pip install flask-mysqldb
    

    数据库连接设置

    • 在 Flask-SQLAlchemy 中,数据库使用URL指定,而且程序使用的数据库必须保存到Flask配置对象的 SQLALCHEMY_DATABASE_URI 键中
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://账户名:密码@127.0.0.1:3306/test'
    
    • 其他设置:
    # 动态追踪修改设置,如未设置只会提示警告
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    #查询时会显示原始SQL语句
    app.config['SQLALCHEMY_ECHO'] = True
    
    • 配置完成需要去 MySQL 中创建项目所使用的数据库
    $ mysql -uroot -pmysql
    $ create database test charset utf8;
    
    • 其他配置

    连接其他数据库

    完整连接 URI 列表请跳转到 SQLAlchemy 下面的文档 (Supported Databases) 。这里给出一些 常见的连接字符串。

    • Postgres:
    postgresql://scott:tiger@localhost/mydatabase
    
    • MySQL:
    mysql://scott:tiger@localhost/mydatabase
    
    • Oracle:
    - oracle://scott:tiger@127.0.0.1:1521/sidname
    
    • SQLite (注意开头的四个斜线):
    sqlite:////absolute/path/to/foo.db
    

    常用的SQLAlchemy字段类型

    常用的SQLAlchemy列选项

    常用的SQLAlchemy关系选项

    数据库基本操作

    • 在Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理。

      • 会话用 db.session 表示。在准备把数据写入数据库前,要先将数据添加到会话中然后调用 commit() 方法提交会话。
    • 在 Flask-SQLAlchemy 中,查询操作是通过 query 对象操作数据。

      • 最基本的查询是返回表中所有数据,可以通过过滤器进行更精确的数据库查询
     1 """
     2 SQLAlchemy是flask的扩展,不是原生自带的
     3 必须配置信息:
     4 1.app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test'
     5 2.# 动态追踪修改设置,如未设置只会提示警告
     6 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
     7 
     8 其他的配置可以自己配,也可以不配值
     9 SQLite是手机等移动终端的数据库
    10 耦合度很低
    11 """
    12 """
    13 1.设置配置文件:
    14 2.创建数据库对象db = SQLAlchemy(app):
    15 3.创建模型类class Book(db.Model):
    16 4.创建表db.create_all():
    17 """
    18 from flask import Flask
    19 from flask_sqlalchemy import SQLAlchemy  # 导入数据库
    20 
    21 app = Flask(__name__)
    22 
    23 
    24 # 1.>设置配置文件
    25 class Config:
    26     # 记住:直接从源码里面拷贝,千万不要手写,很难记
    27     # 设置数据库里面的主机ip,port名字,密码,数据库名
    28     # test20:你创建的数据库名字
    29     # password:你自己设置的登录密码
    30     # root:你的用户名  这一项必须设置
    31     SQLALCHEMY_DATABASE_URI = 'mysql://root:password@localhost:3306/test20'
    32     # 动态追踪修改设置,如未设置只会提示警告,不会报错.这一项必须设置
    33     app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    34     # 打印原始的SQL语句,这一项可以不设置
    35     # app.config['SQLALCHEMY_ECHO'] = True
    36 
    37 
    38 # flask的app对象和数据库进行绑定
    39 app.config.from_object(Config)
    40 
    41 #  create database test20 charset utf8; 创建数据库,记得设置编码方式
    42 #  show create table books; 查看创建过程
    43 
    44 # 创建数据库对象
    45 # SQLAlchemy(app)语法,类创建一个数据库对象,db是名字,可以随意取
    46 # 2.>创建数据库对象.注意:需要放到加载配置文件之后, 务必在app.config.from_object(Config)的后面
    47 db = SQLAlchemy(app)
    48 
    49 
    50 # 建立表,和当前的数据库进行关联
    51 # 创建数据库的模型类,db.Model:语法,表示和当前的数据库进行关联
    52 # 3.>创建模型类<只是设置表结构>
    53 class Book(db.Model):
    54     """设置表结构"""
    55     # 创建表的名字,表的名字可以不设置,因为系统会给一个默认的表名,就是和类的名字一样,只不过是小写字符.但是建议自己设置
    56     __tablename__ = 'books'
    57     # db.Column:注意是C大写
    58     # 创建列id字段,设置成主键
    59     # 注意:在这里必须设置主键,否则无法进行Book类和books表名之间的关联映射.
    60     id = db.Column(db.Integer, primary_key=True)
    61     # 设置书的名字
    62     name = db.Column(db.String(128))
    63     # 作者
    64     author_name = db.Column(db.String(128))
    65 
    66 
    67 if __name__ == '__main__':
    68     # 删除表
    69     db.drop_all()
    70     # 创建数据库中的表
    71     # 4.>创建表
    72     db.create_all()
    73     # 初始化值.book是Book()类创建的对象.表示数据库books表中的一条记录.
    74     book1 = Book()
    75     book1.name = '帝国的沦陷'
    76     book1.author_name = '周作人'
    77     # 提交到数据库
    78     # 初始化完成之后必须提交.否则不会生效
    79     # db.session.add(对象)
    80     db.session.add(book1)
    81     db.session.commit()
    82     app.run()

    常用的SQLAlchemy查询过滤器

    常用的SQLAlchemy查询执行器

      1 """
      2 1.设置配置文件:
      3 2.创建数据库对象db = SQLAlchemy(app):
      4 3.创建模型类class Book(db.Model):
      5 4.创建表db.create_all():
      6 
      7 注意:sqlalchemy只是连接数据库,不能创建数据库
      8 回滚:rollback,不是callback
      9 """
     10 from flask import Flask
     11 from flask_sqlalchemy import SQLAlchemy  # 导入数据库
     12 
     13 app = Flask(__name__)
     14 
     15 
     16 # 1.>设置配置文件
     17 class Config:
     18     SQLALCHEMY_DATABASE_URI = 'mysql://root:password@localhost:3306/test20'
     19     # 动态追踪修改设置,如未设置只会提示警告,不会报错.这个必须设置
     20     app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
     21 
     22 
     23 # flask的app对象必须和配置进行关联
     24 app.config.from_object(Config)
     25 # app交给数据库关联
     26 db = SQLAlchemy(app)
     27 
     28 # ---------------创建两张表----------------
     29 """
     30 角色表和用户表:一对多的关系.一个角色对应着多个用户
     31 一个用户只有一个角色
     32 
     33 
     34 角色表:admin管理员  user普通用户
     35 用户表:张三(管理员),李四(普通),王五(普通)
     36 
     37 一个角色可以对应多个用户:一对多
     38 
     39 """
     40 
     41 
     42 class Role(db.Model):
     43     """角色表"""
     44     __tablename__ = 'roles'
     45     id = db.Column(db.Integer, primary_key=True)
     46     name = db.Column(db.String(128))
     47     # 设置关系
     48     # 让角色和用户表进行关联
     49     # 在设置关系的时候,1的一方设置关系,多的地方设置外键
     50     # 用在多表查询的时候使用.
     51     """
     52     role
     53     Out[15]: Role = admin
     54     
     55     In [16]: role.us
     56     Out[16]: 
     57     [User = wang,Email = wang@163.com,
     58      User = zhou,Email = zhou@163.com,
     59      User = qian,Email = qian@gmail.com,
     60      User = liu,Email = liu@itheima.com]
     61 
     62     """
     63     # backref='role' 反向查询,需要给User设置一个属性,属性名字:role,属性名可以随意取
     64     us = db.relationship('User', backref='role')
     65 
     66     def __repr__(self):
     67         """返回一个可读的字符串,打印数据<平时不需要设置>"""
     68         return '角色:%s' % self.name
     69 
     70 
     71 class User(db.Model):
     72     """用户表"""
     73     __tablename__ = 'users'
     74     id = db.Column(db.Integer, primary_key=True)
     75     name = db.Column(db.String(128))
     76     email = db.Column(db.String(128))
     77     password = db.Column(db.String(128))
     78     # 在多的一方设置外键
     79     role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
     80 
     81     def __repr__(self):
     82         """返回一个可读的字符串,打印数据<平时不需要设置>"""
     83         # 'User = %s,%s' :注意这个格式,是User类中的email属性.对应到数据库中就是users表中的email字段
     84         return '姓名:%s,邮箱:%s' % (self.name, self.email)
     85 
     86 # ipython下面执行下面的语句,然后使用ipython进行测试
     87 # from more_table import *
     88 
     89 @app.route('/')
     90 def index():
     91     u = User.query.all()
     92     return 'index'
     93 
     94 
     95 # 查询有多少个管理员,分别叫什么
     96 
     97 if __name__ == '__main__':
     98     # 删除表,如果存在就先删除,下面会再次创建
     99     db.drop_all()
    100     # 创建数据库中的表
    101     # 4.>创建表
    102     db.create_all()
    103     ro1 = Role(name='admin')
    104     db.session.add(ro1)
    105     db.session.commit()
    106     # 再次插入一条数据
    107     ro2 = Role(name='user')
    108     db.session.add(ro2)
    109     db.session.commit()
    110     # 提交到数据库
    111     # 初始化完成之后必须提交.否则不会生效
    112     # db.session.add(对象)
    113     us1 = User(name='王佳芝', email='wang@163.com', password='123456', role_id=ro1.id)
    114     us2 = User(name='庄聚贤', email='zhang@189.com', password='201512', role_id=ro2.id)
    115     us3 = User(name='陈洪静', email='chen@126.com', password='987654', role_id=ro2.id)
    116     us4 = User(name='周作人', email='zhou@163.com', password='456789', role_id=ro1.id)
    117     us5 = User(name='唐景生', email='tang@itheima.com', password='158104', role_id=ro2.id)
    118     us6 = User(name='吴晗', email='wu@gmail.com', password='5623514', role_id=ro2.id)
    119     us7 = User(name='钱之江', email='qian@gmail.com', password='1543567', role_id=ro1.id)
    120     us8 = User(name='柳弄币', email='liu@itheima.com', password='867322', role_id=ro1.id)
    121     us9 = User(name='李谦钱', email='li@163.com', password='4526342', role_id=ro2.id)
    122     us10 = User(name='孙博文', email='sun@163.com', password='235523', role_id=ro2.id)
    123     db.session.add_all([us1, us2, us3, us4, us5, us6, us7, us8, us9, us10])
    124     db.session.commit()
    125     app.run()
    126 
    127 """
    128 role 查询user role.us 很好查
    129 
    130 user 查询 role  
    131 
    132 """
    1.查询所有用户数据

     

    2.查询有多少个用户

    3.查询第1个用户

    4.查询id4的用户[3种方式]

    5. 查询名字结尾字符为xxx的所有数据[开始/包含]

    6. 查询名字不等于王佳芝的所有数据[2种方式]

    7. 查询名字以王开头并且和邮箱以wang开头的所有数据[2种方式]

    8. 查询password `123456` 或者 `email`  `itheima.com` 结尾的所有数据
     
    9. 查询id [1, 3, 5, 7, 9] 的用户列表

    10. 查询name孙博文的角色数据

    11. 查询所有用户数据,并以邮箱排序(降序排序)

    12. 每页3个,查询第2页的数据

    表中所有数据:

    
    
  • 相关阅读:
    vscode snippet
    OpenGL Type
    [转] fio参数详解
    [转] openchannel SSD( OCSSD)
    [转]linux内存管理
    proc/meminfo && hugepage
    [转] 从free到 page cache
    [转]linux网络协议栈(1)——链路层
    [转]linux 网络协议栈(1)——网络设备
    [转]linux网络协议栈(1)——socket buffer
  • 原文地址:https://www.cnblogs.com/huaibin/p/9858014.html
Copyright © 2011-2022 走看看