技术标签: ORM与SQLAlchemy (1) - 建立第一个模型 Python Flask
后端一个重要的点就是与数据库联系,例如网页的注册、登录,内容的更新等都需要与数据库建立关系。以MySQL
数据库为例,平时我们会用mysqldb(python 2)
或者pymysql(python 3)
去操作MySQL
数据库,但这种方法也是需要自己编写SQL语句的。现在我们有了ORM模型,简单来说,ORM是把数据库中的表抽象成模型,表的列名对应模型的属性,这样我们可以调用类的属性或方法去获得数据库中的数据。例如假设MySQL
数据库中有一张表名为table1
,使用SELECT * FROM table1 WHERE id=1
获取id
为1
的数据,如果将表table1
映射成ORM模型Table
,那么可以直接使用Table.query.filter(id=1)
,这样操作简单了很多,也很利于理解。
SQLAlchemy
就是一个这样的ORM,我们可以直接安装flask_sqlalchemy
来使用。在这之前我们先在MySQL
中手动建立一个数据库harp
,在建立的时候把charset
设置为utf8
,避免存入中文时变成乱码,然后在配置文件config.py
中填写好数据库的连接信息:
HOST = "127.0.0.1"
PORT = "3306"
DB = "harp"
USER = "root"
PASS = "Your Password"
CHARSET = "utf8"
DB_URI = "mysql+pymysql://{}:{}@{}:{}/{}?charset={}".format(USER, PASS, HOST, PORT, DB, CHARSET)
SQLALCHEMY_DATABASE_URI = DB_URI
SQLAlchemy
依赖mysqldb
或者pymysql
去连接数据库和执行SQL语句,因为我们用的是python 3
,所以需要在配置信息中指明使用pymysql
,如果是python 2
可以省略,默认是使用mysqldb
。
建立好了数据库,我们开始建表,首先建立一张用户表,我们设想它应该有id(作为主键)、用户名、密码、注册时间这些基本的字段,有了ORM,我们就不用再写SQL去建表了,在项目的主py文件中添加以下代码:
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
import config
app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)
class Users(db.Model):
__tablename__ = 'users_info'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(32), nullable=False)
password = db.Column(db.String(100), nullable=False)
register_time = db.Column(db.DateTime, nullable=False, default=datetime.now())
db.create_all()
解读一下这段代码,导入SQLAlchemy
和含有数据库连接信息的config
,实例化一个SQLAlchemy
对象名为db
,其传入的参数为Flask
实例app
。接下来定义了一个User
类,这个类就是ORM中的模型,也就是数据库中的表映射的模型,它需要继承自db.Model
,__tablename__
这个属性就是建表后,数据库生成的表名;然后使用db.Column
来实例化id/username/password/register_time
这几个列,db.Column
的参数描述列的类型、主键等信息,如db.Integer/db.String(32)/db.DateTime
分别代表整形、字符串(最大长度)、时间,primary_key=True
说明该字段为主键,autoincrement=True
代表自增长,nullable
决定是否可为空,default
代表默认值。最后用db.create_all()
来实现创建。我们暂时不用理解为何SQLAlchemy
需要传入Flask
实例作为参数,为何模型要继承自db.Model
,重要的是可以先把想要的表建立起来。
进入数据库,输入desc user_info;
,我们发现表已经建立好了,其结构图如下:
但它现在还是空的,我们来试着插入一条语句,将视图函数修改为:
@app.route('/')
def index():
user = Users(username='Harp', password='123456')
db.session.add(user)
db.session.commit()
return render_template('home.html')
代码实例化一个Users
的对象user
,传入username
和password
,使用db.session.add(user)
将其加入到数据库的session
(可以理解为事务)中,然后使用db.session.commit()
提交。我们运行程序,然后用浏览器访问,浏览器正常显示了结果,这时再看一眼数据库,发现这条数据已经写入到了数据库:
查询、修改数据也同样很简单:
@app.route('/')
def index():
user = Users.query.filter(Users.id == 1).first() #查找
print(user.username)
user.username = 'Harp1207' #修改
db.session.commit() #修改后需提交
print(user.username)
return render_template('home.html')
思考问题:
1.为何要把模型的操作语句放在视图函数中?(搜索上下文这个概念)
2.数据查找,我们用的是Model.query
,其实还可以用db.session.query
,两者有何区别?filter和filter_by又有何区别?
文章浏览阅读942次。在11.0 进行定制化开发,会根据需要去掉recovery模式的一些选项 就是在device.cpp去掉一些选项就可以了。_android recovery 删除 部分菜单
文章浏览阅读3.7k次。https://www.yuque.com/mnn/cn/cvrt_linux_mac基础依赖这些依赖是无关编译选项的基础编译依赖• cmake(3.10 以上)• protobuf (3.0 以上)• 指protobuf库以及protobuf编译器。版本号使用 protoc --version 打印出来。• 在某些Linux发行版上这两个包是分开发布的,需要手动安装• Ubuntu需要分别安装 libprotobuf-dev 以及 protobuf-compiler 两个包•..._mnn 编译linux
文章浏览阅读1.8k次。CSS3新增动画属性“@-webkit-keyframes”,从字面就可以看出其含义——关键帧,这与Flash中的含义一致。利用CSS3制作动画效果其原理与Flash一样,我们需要定义关键帧处的状态效果,由CSS3来驱动产生动画效果。下面讲解一下如何利用CSS3制作淡入淡出的动画效果。具体实例可参考刚进入本站时的淡入效果。1. 定义动画,名称为fadeIn@-webkit-keyf_css3入场效果淡入淡出
文章浏览阅读2.8k次。计算机系统应包括硬件和软件两个子系统,硬件和软件又必须依次分别包括中央处理器和系统软件。按人的要求接收和存储信息,自动进行数据处理和计算,并输出结果信息的机器系统。计算机是脑力的延伸和扩充,是近代科学的重大成就之一。计算机系统由硬件(子)系统和软件(子)系统组成。前者是借助电、磁、光、机械等原理构成的各种物理部件的有机组合,是系统赖以工作的实体。后者是各种程序和文件,用于指挥全系统按指定的要求进行..._计算机系统包括硬件系统和软件系统 软件又必须包括
文章浏览阅读4w次,点赞85次,收藏305次。前文重复数据的情况分为两种:单个字段 数据重复多个字段 数据重复所以该篇的内容就是包括单个字段的重复数据查找 与 去重多个字段的重复数据查找 与 去重正文示例 accountinfo 表数据如下:场景一 单个字段重复数据查找 & 去重我们要把上面这个表中 单个字段 account字段相同的数据找出来。思路 分三步 简述:第一步要找出重复数据,我们首先想到的就是,既然是重复,那么数量就是大于 1..._mysql查询某个字段重复的数据
文章浏览阅读88次。原文地址:http://www.ibm.com/developerworks/cn/linux/opensource/os-ecc/用 Eclipse 平台进行 C/C++ 开发Pawel Leszek 是 Studio B 的一位作家,他是一位专长于 Linux/Win/Mac OS 系统体系结构和管理的独立软件顾问和作家。他具有许多操作系统、编程语言和网络协议方面的经验..._eclipse c++ 创建控件
文章浏览阅读133次。rownum是oracle才有的写法,rownum在oracle中可以用于取第一条数据,或者批量写数据时限定批量写的数量等mysql取第一条数据写法SELECT * FROM t order by id LIMIT 1;oracle取第一条数据写法SELECT * FROM t where rownum =1 order by id;ok,上面是mysql和oracle取第一条数据的写法对比,不过..._mysql 替换@rownum的写法
文章浏览阅读790次,点赞3次,收藏4次。官网下载下载链接:http://www.eclipse.org/downloads/点击Download下载完成后双击运行我选择第2个,看自己需要(我选择企业级应用,如果只是单纯学习java选第一个就行)进入下一步后选择jre和安装路径修改jvm/jre的时候也可以选择本地的(点后面的文件夹进去),但是我们没有11版本的,所以还是用他的吧选择接受安装中安装过程中如果有其他界面弹出就点accept就行..._ecjelm
文章浏览阅读245次。原文链接:https://linux.cn/article-7801-1.htmlifconfigping <IP地址>:发送ICMP echo消息到某个主机traceroute <IP地址>:用于跟踪IP包的路由路由:netstat -r: 打印路由表route add :添加静态路由路径routed:控制动态路由的BSD守护程序。运行RIP路由协议gat..._ifconfig 删除vlan
文章浏览阅读224次。reduxredux里要求把数据都放在公共的存储区域叫store里面,组件中尽量少放数据,假如绿色的组件要给很多灰色的组件传值,绿色的组件只需要改变store里面对应的数据就行了,接着灰色的组件会自动感知到store里的数据发生了改变,store只要有变化,灰色的组件就会自动从store里重新取数据,这样绿色组件的数据就很方便的传到其它灰色组件里了。redux就是把公用的数据放在公共的区域去存..._redux redis
文章浏览阅读2.2k次,点赞3次,收藏6次。unzip版本不支持4G以上的压缩包所以要使用p7zip:Linux一个高压缩率软件wget http://sourceforge.net/projects/p7zip/files/p7zip/9.20.1/p7zip_9.20.1_src_all.tar.bz2tar jxvf p7zip_9.20.1_src_all.tar.bz2cd p7zip_9.20.1make && make install 如果安装失败,看一下报错是不是因为没有下载gcc 和 gcc ++(p7_linux 7za解压中文乱码
文章浏览阅读2.1w次,点赞6次,收藏31次。获取客户端IP一、标题网络上常见的请求头1、X-Forwarded-For2、Proxy-Client-IP3、WL- Proxy-Client-IP4、HTTP_CLIENT_IP5、X-Real-IP二、注意事项1、非标准请求头2、不一定存在3、多重代理顺序4、请求头伪造三、代码场景样例一、标题网络上常见的请求头1、X-Forwarded-For这是一个 Squid 开发的字段,只有在通过了 HTTP 代理或者负载均衡服务器时才会添加该项。格式为X-Forwarded-For: client1, _获取http请求ip