Python-ORM之sqlalchemy的简单使用
ORM之sqlalchemy
基础章节
使用SQLAlchemy链接数据库
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine("mysql+pymysql://root:Leon@localhost/study?charset=utf8",encoding='utf-8',echo=True)
Base = declarative_base()
创建数据表
from sqlalchemy import Column, Integer, String
class User(Base):
__tablename__ = 'user' # 表名
# 各个字段
id = Column(Integer, primary_key=True) # 主键
name = Column(String(32))
password = Column(String(64))
def __repr__(self): # 返回数据定义
return "[%s,%s,%s]"%(self.id,self.name,self.password)
Base.metadata.create_all(engine) # 创建表结构
- 其他的一些经常用到的地方
# Column中还可以设定是否唯一:unique=True
# 设置值不为空:nullable=False
# 时间格式为:DateTime
# 枚举值:Column(Enum("1","2","3"))
# 布尔值:Boolean,表现形式为True/False
添加数据
Session_class = sessionmaker(bind=engine) # 创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
session = Session_class() # 生成session实例
#add
user_obj = User(name="Leon", password="123456")
user_obj1 = User(name="张三", password="156")
session.add_all([user_obj,user_obj1]) #添加
# session.add(obj1)这样可以单个的添加
session.comiit() #事务提交
查询数据
# 返回数据需要在类中的__repr__中设定
session.query(User).filter(User.name=="Leon").first() # 查询第一个
session.query(User).filter(User.name=="Leon").all() # 查询多个,返回一个可循环列表对象
# 多个查询使用多个filter进行过滤
# 也可以在filter中用逗号`,`来and匹配
数据修改
user_obj = session.query(User).filter(User.name=="Leon").first()
user_obj.password = "NewPassword"
session.comiit()
数据删除
obj = session.query(User).filter(User.name=="Leon").first()
session.delete(obj)
session.commit()
统计
print(session.query(User).filter(User.name=="Leon").count())
分组
from sqlalchemy import func
print(session.query(func.count(User.name),User.name).group_by(User.name).all())
深入章节
外键关联
1.设置外键
+ 场景:一个学生拥有多个上课记录
+ 数据库表结构
class Student(Base):
__tablename__ = "student"
id = Column(Integer,primary_key=True)
name = Column(String(32),nullable=False)
register_data = Column(DATE,nullable=False)
def __repr__(self):
return "%s,%s" % (self.id, self.name)
class StudyRecord(Base):
__tablename__ = 'study_record'
id = Column(Integer, primary_key=True)
day = Column(Integer,nullable=False)
status = Column(String(32),nullable=False)
stu_id = Column(Integer,ForeignKey('student.id'))
# 加上一个关系,在这个表中可以通过student来反查student表中的数据,而在student表中可以通过my_study_record来反查StudyRecord中的数据
student = relationship("Student",backref="my_study_record")
def __repr__(self):
return "%s day:%s status: %s"%(self.student.name,self.day,self.status)
2.在表中查询数据
# 查询某个人的上课记录
stu_obj = session.query(Student).filter(Student.name=="Leon").first()
print(stu_obj.my_study_record) # 在student表中通过my_study_record来反查StudyRecord中的数据,显示跟局repr来定,此处返回字符串
# 连表反向查询,查询没来上课的人
record_obj = session.query(StudyRecord).filter(StudyRecord.status=="NO").first()
print(record_obj.student)
多外键关联
1.多外键
- 场景:一个电商用户,拥有两个地址,一个用来收取商品、另外一个用来邮寄账单
- 数据库表结构设计:
class Customer(Base):
__tablename__ = 'customer'
id = Column(Integer, primary_key=True)
name = Column(String(64))
billing_address_id = Column(Integer, ForeignKey("address.id"))
shipping_address_id = Column(Integer, ForeignKey("address.id"))
# 一个人对应一个账单地址和一个购物地址
address_b = relationship("Address",backref="my_addr_bill",foreign_keys=[billing_address_id])
address_s = relationship("Address",backref="my_addr_shop",foreign_keys=[shipping_address_id])
def __repr__(self):
return "name:%s"%self.name
class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
street = Column(String(64))
city = Column(String(64))
state = Column(String(64))
def __repr__(self):
return "street:%s|city:%s|state:%s"%(self.street,self.city,self.state)
2.添加数据
a1 = Address(street='望京',city='北京',state="中国")
a2 = Address(street='雁塔',city='西安',state="中国")
a3 = Address(street='太原',city='山西',state="中国")
session.add_all([a1,a2,a3])
c1 = Customer(name="Leon",address_b=a1,address_s=a2)
c2 = Customer(name="eric",address_b=a1,address_s=a3)
session.add_all([c1,c2])
session.commit()
3.在此表中查询数据
# 通过名字直接查询他的两个地址
customer_obj = session.query(Customer).filter(Customer.name=="Leon").first()
print(customer_obj.address_b,customer_obj.address_s)
# 通过地址查询该地址属于谁
Add_obj = session.query(Address).filter(Address.city=="北京").first()
print(Add_obj.my_addr_bill)
多对多关联
1.创建表结构
- 场景:一个作者可以写很多本书,一本书有多个做这个
- 数据库关系:
# 一个作者可以出版很多本书,一本书有很多个作者,直接用第三张表来讲作者表和图书表关联起来
class Author(Base):
__tablename__ = 'authors'
id = Column(Integer, primary_key=True)
name = Column(String(32)) # 作者
def __repr__(self):
return self.name
book_m2m_author = Table('book_m2m_author', Base.metadata,
Column('book_id',Integer,ForeignKey('books.id')),
Column('author_id',Integer,ForeignKey('authors.id')),
)
class Book(Base):
__tablename__ = 'books'
id = Column(Integer,primary_key=True)
name = Column(String(64))
pub_date = Column(DATE) # 出版日期
authors = relationship('Author',secondary=book_m2m_author,backref='books')
def __repr__(self):
return self.name
2.添加数据
# 添加数据
b1 = Book(name='Python',pub_date='2017-08-29')
b2 = Book(name='Linux',pub_date='2011-5-2')
b3 = Book(name='PHP',pub_date='2012-3-9')
b4 = Book(name='Java',pub_date='2015-11-2')
a1 = Author(name="Leon")
a2 = Author(name="Jack")
a3 = Author(name="Rain")
#建立关系
b1.authors=[a1,a2]
b2.authors=[a1,a3]
b3.authors=[a2,a3]
b4.authors=[a1,a2,a3]
Session_class = sessionmaker(bind=engine)
session = Session_class()
session.add_all([b1,b2,b3,b4,a1,a2,a3])
session.commit()
3.数据查询
book_obj = session.query(Book).filter(Book.name=='Python').first()
print(book_obj.authors)
authors_obj = session.query(Author).filter(Author.name=="Leon").first()
print(authors_obj.books)
4.此时删除数据
- 删除一本书中的某一个作者
author_obj =s.query(Author).filter_by(name="Jack").first()
book_obj = s.query(Book).filter_by(name="Python").first()
book_obj.authors.remove(author_obj) #从一本书里删除一个作者
session.commit()
- 直接删除作者或者一本书,这样
book_m2m_author
表中的数据也会自动更新
author_obj =s.query(Author).filter_by(name="Alex").first()
session.delete(author_obj)
session.commit()
Python-ORM之sqlalchemy的简单使用的更多相关文章
- Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
1. 添加一个新对象 前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中: 复制代码 ...
- python ORM之sqlalchemy
前沿对象关系映射ORM是在实际应用编程中常用到的技术,它在对象和关系之间建立了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化.简单来说就是开发人员在使用ORM模型编程时,不需 ...
- python ORM模块sqlalchemy的使用
1.安装sqlalchemy pip install sqlalchemy 2.导入必要的包及模块 import sqlalchemy from sqlalchemy.ext.declarative ...
- python连接数据库使用SQLAlchemy
参考python核心编程 ORM(Object Relational Mapper),如果你是一个更愿意操作Python对象而不是SQL查询的程序员,并且仍然希望使用关系型数据库作为你的后端,那么你可 ...
- Django和SQLAlchemy,哪个Python ORM更好?
ORM是什么? 在介绍Python下的两个ORM框架(Django和SQLAlchemy)的区别之前,我们首先要充分了解ORM框架的用途. ORM代表对象关系映射.ORM中的每个单词解释了他们在实际项 ...
- python(十二)下:ORM框架SQLAlchemy使用学习
此出处:http://blog.csdn.net/fgf00/article/details/52949973 本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 ...
- 【Python】ORM框架SQLAlchemy的使用
ORM和SQLAlchemy简介 对象关系映射(Object Relational Mapping,简称ORM),简单的来说,ORM是将数据库中的表与面向对象语言中的类建立了一种对应的关系.然后我们操 ...
- python的ORM框架SQLAlchemy
本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 一.ORM介绍 如果写程序用pymysql和程序交互,那是不是要写原生sql语句 ...
- Python与数据库[2] -> 关系对象映射/ORM[0] -> ORM 与 sqlalchemy 模块
ORM 与 sqlalchemy 1 关于ORM / About ORM 1.1 ORM定义 / Definition of ORM ORM(Object Relational Mapping),即对 ...
- Python与数据库[2] -> 关系对象映射/ORM[1] -> sqlalchemy 的基本使用示例
sqlalchemy 的基本使用示例 下面的例子中将利用sqlalchemy进行数据库的连接,通过orm方式利用类实例属性操作的方式对数据库进行相应操作,同时应用一些常用的函数. 完整代码如下: fr ...
随机推荐
- docker入门(二)容器与镜像的理解
10张图带你深入理解Docker容器和镜像 申明:此篇文章是转载的(原文地址http://dockone.io/article/783),今天意外发现已经有人转载了(复制了),希望大家关注原创 原本打 ...
- AutoCAD开发选择----ObjectARX还是.net API(转载)
本文基于AutoCAD 2006新推出的.NET API为工具,介绍了在.NET平台下对AutoCAD进行二次开发的技术,并与目前常用的VBA.ObjectARX作了对比.同时讨论了如何弥补.NET ...
- 新版elasticsearch的插件安装
安装 yum localinstall elasticsearch-6.1.1.rpm -y mkdir -p /elk/{data,logs} && chown -R elastic ...
- 【转】一些常用的Vi命令,可帮助脱离鼠标
使用Vi编写代码时,如果想脱离鼠标,需要使用一些命令快捷键,下面罗列了一些常用的并且容易记住的: 1. 命令模式下,移动光标或跳转 0到行首 ^到行首第一个非空字符 $到行尾非空字符 fx向后移动光标 ...
- 简述 Hibernate 和 JDBC 的区别、优缺点
1.hibernate是一个开源的.采用面向对象的思想实现ORM映射框架,它对jdbc进行了一层封装,对于数据库的连接.关闭.数据的持久化(增删改查).事务的管理都进行了封装,使得程序开发的时候可以用 ...
- NetCloud——一个网易云音乐评论抓取和分析的Python库
在17的四月份,我曾经写了一篇关于网易云音乐爬虫的文章,还写了一篇关于评论数据可视化的文章.在这大半年的时间里,有时会有一些朋友给我发私信询问一些关于代码方面的问题.所以我最近抽空干脆将原来的代码整理 ...
- SQL Server中计算表达式的和
项目使用的是SQL Server数据库,需要做一个审核规则,字段A中表达式的值和字段B中的值,做比较: 需求本身很简单,但是表达式中存在很多非法字符(非法全角,运算符,汉字--) eg:1.1.1*2 ...
- JAVA设计模式---装饰者模式
写在前面的话: 该模式动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案.装饰者可以在被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的 ...
- How to create and start VirtualBox VM without GUI
Suppose you want to create and run virtual machines (VMs) on VirtualBox. However, a host machine doe ...
- BZOJ 4514: [Sdoi2016]数字配对 [费用流 数论]
4514: [Sdoi2016]数字配对 题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数 ...