python SQLAchemy常用语法
SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
SQLAchemy下载
- pip3 install sqlalchemy
SQLAchemy使用
SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:
- MySQL-Python
- mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
- pymysql
- mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
- MySQL-Connector
- mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
- cx_Oracle
- oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
- 更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html
1、用sqlalchemy建表
- import sqlalchemy
- from sqlalchemy import create_engine
- from sqlalchemy.ext.declarative import declarative_base
- from sqlalchemy import Column, Integer, String
- # 连接方式 mysql+pymysql 用户名 root 密码 123456 主机 localhost 库 testdb encoding 字符集
- engine = create_engine("mysql+pymysql://root:123456@localhost/testdb",encoding='utf-8', echo=True)
- Base = declarative_base() # 生成orm基类
- class User(Base):
- __tablename__ = 'user' # 表名
- id = Column(Integer, primary_key=True)
- name = Column(String(32))
- password = Column(String(64))
- Base.metadata.create_all(engine) # 创建表结构
如果数据库已经有了这个表了就不会创建了,也不会报错。
添加数据
先导入sessionmaker
- from sqlalchemy.orm import sessionmaker
- Session_class = sessionmaker(bind=engine) # 创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
- Session = Session_class() # 生成session实例 cursor
- user_obj1 = User(name="alex", password="alex3714") # 生成你要创建的数据对象
user_obj2 = User(name="jack", password="122") # 生成你要创建的数据对象- print(user_obj.name, user_obj.id) # 此时还没创建对象呢,不信你打印一下id发现还是None
- Session.add(user_obj1) # 把要创建的数据对象添加到这个session里, 一会统一创建
Session.add(user_obj2) # 把要创建的数据对象添加到这个session里, 一会统一创建- print(user_obj.name, user_obj.id) # 此时也依然还没创建
- Session.commit() # 现此才统一提交,创建数据
数据查询
- Session_class = sessionmaker(bind=engine) # 创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
- Session = Session_class() # 生成session实例 cursor
- data = Session.query(User).filter_by(name="alex").all() #filter_by 查出来的是一个列表
- print(data)
- data = Session.query(User).filter_by().all()
如果filter_by没有设置条件就把表中的数据都查出来了。
虽然是4条数据,但是完全看不懂,转换下数据显示格式。
在User类中添加一个方法:
- class User(Base):
- __tablename__ = 'user' # 表名
- id = Column(Integer, primary_key=True)
- name = Column(String(32))
- password = Column(String(64))
- def __repr__(self): #添加的方法
- return "<%s name:%s>" % (self.id,self.name)
first() 取数据的第一条 , 没有last()方法
- data = Session.query(User).filter_by().first()
filter_by和filter的小区别
某些条件下用filter_by:
- data = Session.query(User).filter_by(id=2).all()
转成filter就要写成:
- data = Session.query(User).filter(User.id==2).all()
还有就是filter_by不能直接写 > <这种条件 要用filter。
- data = Session.query(User).filter(User.id>2).all()
多个条件
- data = Session.query(User).filter(User.id>2).filter(User.id<5).all()
修改数据
还是通过面向对象的方式修改。
- data = Session.query(User).filter(User.id>2).filter(User.id<5).first()
- print(data)
- data.name = 'Jack Liu'
- data.password = 'Shit happens'
- Session.commit()
原数据的name
回滚
原理和事务的回滚是一样的。
- my_user = Session.query(User).filter_by(id=1).first()
- my_user.name = "Jack"
- fake_user = User(name='Rain', password='12345')
- Session.add(fake_user)
- print(Session.query(User).filter(User.name.in_(['Jack', 'rain'])).all()) # 这时看session里有你刚添加和修改的数据
- Session.rollback() # 此时你rollback一下
- print('after rollback')
- print(Session.query(User).filter(User.name.in_(['Jack', 'rain'])).all()) # 再查就发现刚才添加的数据没有了。
统计和分组
统计 count()
- Session.query(User).filter(User.name.in_(['Jack', 'rain'])).count()
分组
- from sqlalchemy import func
- Session.query(func.count(User.name),User.name).group_by(User.name).all()
第二种建表方式 不常用 了解即可
- from sqlalchemy import Table, MetaData, Column, Integer, String, ForeignKey
- from sqlalchemy.orm import mapper
- metadata = MetaData()
- #表结构 通过Table创建表
- user = Table('user', metadata,
- Column('id', Integer, primary_key=True),
- Column('name', String(50)),
- Column('fullname', String(50)),
- Column('password', String(12))
- )
- class User(object): #不继承Base 自定义类
- def __init__(self, name, fullname, password):
- self.name = name
- self.fullname = fullname
- self.password = password
- mapper(User, user) #把这个类和表结果关联一下
python SQLAchemy常用语法的更多相关文章
- python MVC、MTV 框架介绍 Django 模板系统常用语法
Django 框架简介一.MVC框架和MTV框架1.MVC 全名Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分.优势: 耦合性低 重用性高 生命 ...
- python yield from 语法
python yield from 语法 yield语法比较简单, 教程也很多 , yield from的中文讲解很少 , python官网是这样解释的 PEP 380 adds the yield ...
- python字符串常用内置方法
python字符串常用内置方法 定义: 字符串是一个有序的字符的集合,用与存储和表示基本的文本信息. python中引号中间包含的就是字符串. # s1='hello world' # s2=&quo ...
- 【转】python 历险记(四)— python 中常用的 json 操作
[转]python 历险记(四)— python 中常用的 json 操作 目录 引言 基础知识 什么是 JSON? JSON 的语法 JSON 对象有哪些特点? JSON 数组有哪些特点? 什么是编 ...
- python 历险记(四)— python 中常用的 json 操作
目录 引言 基础知识 什么是 JSON? JSON 的语法 JSON 对象有哪些特点? JSON 数组有哪些特点? 什么是编码和解码? 常用的 json 操作有哪些? json 操作需要什么库? 如何 ...
- python 历险记(三)— python 的常用文件操作
目录 前言 文件 什么是文件? 如何在 python 中打开文件? python 文件对象有哪些属性? 如何读文件? read() readline() 如何写文件? 如何操作文件和目录? 强大的 o ...
- python中常用的模块二
一.序列化 指:在我们存储数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式,这个就是序列化, 不同的序列化结果不同,但目的是一样的,都是为了存储和传输. 一,pickle.可 ...
- 二. Python基础(2)--语法
二. Python基础(2)--语法 1.实现一个简单的登录系统 '''# 形式1 n = 1 while n < 4: name = input("请输入姓名\n" ...
- python关键的语法
python关键的语法 1.标准类型分类
随机推荐
- post调试postman
载地址:https://www.getpostman.com/ 教程地址:http://www.cnblogs.com/s380774061/p/4624326.html
- linux 安装python
wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz #下载安装包 tar zxvf Python-3.6.0.tgz #解压 . ...
- 文献综述十七:基于 sql环境下超市管理系统的设计与实现
一.基本信息 标题:基于 sql环境下超市管理系统的设计与实现 时间:2018 出版源:智能计算机与应用 文件分类:uml技术的研究 二.研究背景 从超市管理系统的实际应用出发,在系统分析过程中,从功 ...
- python 实现dns 解析发送接收报文
http://www.qingruxu.com/code/python/851.html https://tools.ietf.org/html/rfc1035里面的图不一定正确,可以使用抓包软件来进 ...
- (转)MySQL open_files_limit相关设置
http://www.cnblogs.com/zhoujinyi/archive/2013/01/31/2883433.html---------------------------MySQL ope ...
- Rails 中 mattr_accessor 一处文档错误
http://xiewenwei.github.io/blog/2015/01/11/mattr-accessor-in-ruby-on-rails-activesupport/ module Hai ...
- Django级联删除的选项
Django级联删除的选项 Django模型中的on_delete属性具有如下选项: CASCADE 级联删除,也就是被引用的实体被删除后,相关的记录信息都会被删除. PROTECT 阻止删除被引用的 ...
- php将“\\”转换成“\”的例子
str_replace('\\\\', '\\', $url);
- MySQL优化--创建索引,以及怎样索引才会生效 (03)
1. 创建索引 (看这里) 2.索引在什么情况下才会起作用(重点)
- nginx启动,停止,重启
Nginx的启动.停止与重启 启动 启动代码格式:nginx安装目录地址 -c nginx配置文件地址 例如: [root@LinuxServer sbin]# /usr/local/nginx/ ...