创业黑马上市
自媒体
公关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对象进行读取和修改