• 吴晓波


    创业黑马上市

    自媒体 

    公关vp

    中国的财经界的

    被动的创业

    2008----2018年

    水大 鱼大

    经济总量翻倍

    后市场经济

    -------

    以前的很多规则现在已经不适用了

    印刷业和大数据

    ------

    腾讯传 花了5年时间

    ------

    为了基于数据库抽象出数据模型  我们需要使用一个叫做SQLAlchemy的Python包

    最底层包装了数据库操作接口 最上层提供了对象关系映射(ORM)

    ORM是在基于不同的数据结构和系统类型的数据源之间传递和转化数据的集合。

    Python这样的语言允许你在不同的对象之间建立引用。读取和设置他们的属性,

    SQLAlchemy这样的ORM能为你将对象操作转化为传统的 数据库操作。

    ---------

    为了把SQLAlchemy绑定到我们的应用上下文 我们可以使用Flask-SQLAlchemy

    -------

    Flask SQLAlchemy在SQLAlchemy上提供了一层包装 这样就可以结合Flask的一些特性来方便地调用SQLAlchemy的功能

    如果你对SQLAlchemy已经很熟悉 你可以单独使用它  而无须和Flask SQLAlchemy一起使用

    -----------

    SQLite是无须运行服务的SQL数据库  运行速度很快 所有的数据包都包含在一个文件中

    而且支持Python  

    安装Flask SQLAlchemy

    pip  install  flask-sqlalchemy

    -----------

    我们要安装一些特定的包 作为SQLAlchemy与你所做选择的数据库之间的连接器

    SQLite用户可以跳过这一步;

    #MySQL

    pip  install PyMySQL

    # Postgres

    pip  install Psycopg2

    #MSSQL

    pip  install pyodbc

    #Oracle

    pip  install cx_Oracle

    --------

    SQLAlchemy通过一个特殊的数据库URI来创建数据库连接

    databasetype+driver://user:password@ip:port/db_name

    ------

    SQLAlchemy 不但允许我们根据数据库表结构创建数据模型(model)

    也允许我们根绝数据模型创建数据库表结构  所以当我们把第一个模型创建出来以后表结构也就有了

    ----------

    首先在main.py文件中我们将我们的app对象传递给SQLAlchemy 将SQLAlchemy

    初始化

    ------

    SQLAlchemy会从app的配置中读取信息  自动连接到数据库 首先在main.py中创建一个模型

    它会跟相应的 一个user表进行交互

    当我们集成db.Model时  与数据库连接和通信的工作已经自动完成了

    ---------

    db.Column的构造函数里  第一个参数 是可选的  

    通过这个参数我们可以指定 该属性在数据库中的字段名

    如果没有指定  则SQLAlchemy 会认为字段名与这个属性的名字是一样的 

    如果要指定这个可选参数则可以这样写

    username=db.Column('user_name',db.String(255))

    我们在书中的主要类型

    db.String

    db.Text

    db.Integer

    db.Float

    db.Boolean

    db.DateTime

    db.Time

    -------

    String和Text类型会接收Python的字符串

    转换为varchar  text类型的字段

    Integer和Float类型则会接受Python的任意数值类型  -----

    --------

    如果你希望真正理解SQLAlchemy是怎么把你的代码翻译成SQL查询语句的 则可以在DevConfig文件中加入

    SQLALCHEMY_ECHO=True

    -------

    SQLAlchemy会假设你的表名就是模型类名的小写版本

    如果你想指定名字

    可以添加__tablename__的类属性

    通过这个方式你也可以使用在数据库中已经存在的表 只需要表名设为该属性的值

    -----、

    class User(db.Model):

      __tablename__="user_table_name"

    我们不需要定义__init__或__repr__方法  如果我们没有定义

    则SQLAlchemy会自动创建__init__方法  你定义的所有字段名将会成为此方法所接受的关键字

    ------

    数据模型之间的关联

    在SQLAlchemy里面表现为两个或者更多模型之间的链接 模型之间可以互相引用

    使得相关联的数据能 很容易地从数据库中取出

    -----

    例如文章和它的评论

    这就是 关系数据库管理系统

    ------

    外键约束

    ------

    Foreign  Key  Constraint  外键约束是数据库中的一种约束规则

    =------=------=----=----=----=----=------=-----=----=-----=----=---=---=---

    外键约束是数据库中的一种约束规则,在这里 它强制要求 user_id

    字段的值存在于user表的id列中

    这是数据库进行的一项检查 用来保证 每个Post对象都会对应到一个已有的user

    ------------------

    传给db.ForeignKey的参数,是一个用来代表user表id列的字符串

    ------------------

    如果你要用__tablename__自定义表名, 则需要同时需改这个字符串

    之所以直接用表名,而不是用User.id引用,

    因为在SQLAlchemy初始化期间 User对象可能还没有被创建出来。

    --------

    user_id字段还不足以让SQLAlchemy建立我们想要的关联  我们还需要这样修改User对象:

        class User(db.Model):

        id =db.Column(db.Integer(),primary_key)

                username=db.Column(db.String(255))

        password=db.Column(db.String(255))

                posts=db.relationship(

          'Post',

          backref='user',

          lazy='dynamic'

    )

    ---------

    db.relationship函数在SQLAlchemy中创建了一个虚拟的列

    它会和我们的Post对象中的db.ForeignKey建立联系。

    待会我们再来讲backref的含义

    不过lazy参数又是什么?

    lazy参数会告诉SQLAlchemy如何去加载我们指定的 关联对象 。

    ------

    如果设为  子查询方式 (subquery) 则会加载完Post对象的时候,就立即加载与其关联的对象。

    这样会让总查询数量减少  但如果返回的条目数量很多  就会比较慢

    另外 也可以设置动态方式 (dynamic)这样 关联对象  会在被使用的时候在进行加载

    并且在返回前进行过滤  如果返回的对象很多 或者未来会变得很多  那最好采用这样方式。

    ------

    我们可以使用User.posts 属性来得到一个Posts列表

    其中的每项user_id值都跟我们的User.id值相等  下面可以在命令行里面试下;;;

    --------

    backref参数则可以使我们通过Post.user属性对User对象进行读取和修改

  • 相关阅读:
    2012工作计划!
    造船篇系统实施(新老衔接工作)
    Android学习摘要一之Android历史
    DEVReport控件使用方法
    造船篇 前传
    软件实施(1)
    茫然疑问未来
    造船篇钢材管理
    wcf身份验证问题
    IDL中关于波段计算的问题
  • 原文地址:https://www.cnblogs.com/yizhixuepython/p/9244272.html
Copyright © 2020-2023  润新知