要使用SQLAlchemy,必须先下载这个模块

  • pip3 install sqlalchemy 或 pycharm File--> Settings-->project...-->Project Interpreter-->右上+-->搜索你要安装的模块
  • 源码安装,源码下载地址:https://www.oschina.net/news/84998/sqlalchemy-1-1-10

  开始操作前,你必须清楚SQLAlchemy实现操作数据库的原理,SQLAlchemy本身是无法操作数据库的,必须通过第三库pymysql,而SQAlchemy内的Dialect就是用来和数据API进行交流的,实现过程就是利用python最为常用的类和对象来,一张表就是一个类,一行数据就是一个对象

  了解到这,就是开始我们的实战吧!利用ORM(关系对象映射)创建表,分5步走

  第一步:导模块

#导模块
#用于和数据库创建连接
from sqlalchemy import create_engine
#用于实例一个基类,创建表时必须继续这个父类
from sqlalchemy.ext.declarative import declarative_base
#导入表元素,列,数据类型,外键,索引..
from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index

  第二步:创建数据库连接

  数据传入格式mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]

#连接数据库,在这里传入你要使用的数据库类型和第三方操作数据库的模块
engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/db1",echo=True,max_overflow=5)

  第三步:创建基类

  创建表类时 ,必须继承这个类

#创建基类
Base = declarative_base()

  第四步:创建表,记得要继承基类

#创建表类
class Users(Base):
__tablename__ = 'users'
nid = Column(Integer,primary_key=True)
name = Column(String(32))
extra = Column(String(16)) __table_args__ = (
UniqueConstraint('nid','name',name='uix_nid_name'),
Index('ix_name_extra','name','extra'),
)

  第五步:

#由于上面只是在代码级别实现,还没真正的创建表,所有还需一个执行动作
Base.metadata.create_all(engine)

全部代码:

# usr/bin/env python
# -*- encoding:utf-8 -*- #导模块
#用于和数据库创建连接
from sqlalchemy import create_engine
#用于实例一个基类,创建表时必须继续这个父类
from sqlalchemy.ext.declarative import declarative_base
#导入表元素,列,数据类型,外键,索引..
from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index #连接数据库,在这里传入你要使用的数据库类型和第三方操作数据库的模块
engine = create_engine("mysql+pymysql://root:lpfendou2015,,@127.0.0.1:3306/db1",echo=True,max_overflow=5) #创建基类
Base = declarative_base() #创建表类
class Users(Base):
__tablename__ = 'users'
nid = Column(Integer,primary_key=True)
name = Column(String(32))
extra = Column(String(16)) __table_args__ = (
UniqueConstraint('nid','name',name='uix_nid_name'),
Index('ix_name_extra','name','extra'),
) #由于上面只是在代码级别实现,还没真正的创建表,所有还需一个执行动作
Base.metadata.create_all(engine)

  一对多创建表,重点就是外键

#一对多
#外键关联的表要先创建
class Favor(Base):
__tablename__ = 'favor'
nid = Column(Integer,primary_key=True)
caption = Column(String(50),default='red',unique=True) class Person(Base):
__tablename__ = 'person'
nid = Column(Integer,primary_key=True)
name = Column(String(32),index=True,nullable=True)
favor_id = Column(Integer,ForeignKey('favor.nid'))

  多对多创建表

#多对多,需要创建三张表
class Group(Base):
__tablename__ = 'group'
nid = Column(Integer,primary_key=True)
name = Column(String(64),unique=True,nullable=False)
port = Column(Integer,default=22) class Server(Base):
__tablename__ = 'server'
nid = Column(Integer,primary_key=True,autoincrement=True)
hostname = Column(String(64),unique=True,nullable=False) class ServerToGroup(Base):
__tablename__ = 'servertogroup'
nid = Column(Integer,primary_key=True,autoincrement=True)
sever_id = Column(Integer,ForeignKey('server.nid'))
group_id = Column(Integer,ForeignKey('group.nid'))

  删除所有的表

    Base.metadata.drop_all(engine)

完整代码

# usr/bin/env python
# -*- encoding:utf-8 -*- #导模块
#用于和数据库创建连接
from sqlalchemy import create_engine
#用于实例一个基类,创建表时必须继续这个父类
from sqlalchemy.ext.declarative import declarative_base
#导入表元素,列,数据类型,外键,索引..
from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index #连接数据库,在这里传入你要使用的数据库类型和第三方操作数据库的模块
engine = create_engine("mysql+pymysql://root:lpfendou2015,,@127.0.0.1:3306/db1",echo=True,max_overflow=5) #创建基类
Base = declarative_base() #创建表类
class Users(Base):
__tablename__ = 'users'
nid = Column(Integer,primary_key=True)
name = Column(String(32))
extra = Column(String(16)) __table_args__ = (
UniqueConstraint('nid','name',name='uix_nid_name'),
Index('ix_name_extra','name','extra'),
) #一对多
#外键关联的表要先创建
class Favor(Base):
__tablename__ = 'favor'
nid = Column(Integer,primary_key=True)
caption = Column(String(50),default='red',unique=True) class Person(Base):
__tablename__ = 'person'
nid = Column(Integer,primary_key=True)
name = Column(String(32),index=True,nullable=True)
favor_id = Column(Integer,ForeignKey('favor.nid')) #多对多,需要创建三张表
class Group(Base):
__tablename__ = 'group'
nid = Column(Integer,primary_key=True)
name = Column(String(64),unique=True,nullable=False)
port = Column(Integer,default=22) class Server(Base):
__tablename__ = 'server'
nid = Column(Integer,primary_key=True,autoincrement=True)
hostname = Column(String(64),unique=True,nullable=False) class ServerToGroup(Base):
__tablename__ = 'servertogroup'
nid = Column(Integer,primary_key=True,autoincrement=True)
sever_id = Column(Integer,ForeignKey('server.nid'))
group_id = Column(Integer,ForeignKey('group.nid')) #由于上面只是在代码级别实现,还没真正的创建表,所有还需一个执行动作
def init_db():
Base.metadata.create_all(engine) def drop_db():
Base.metadata.drop_all(engine)

操作表

  在操作之前,还需要做两步

  第一步:导模块

#操作表时用到,sessionmaker用于实例操作表的对象,relationship在表类中定义,方便查询
from sqlalchemy.orm import sessionmaker,relationship

   第二步:创建操作对象

Session = sessionmaker(bind=engine)
session = Session()

  增 add  add_all(列表)

#增
obj = Users(name='alex0',extra='sb')
session.add(obj)
session.add_all([
Users(name='alex1',extra='sb'),
Users(name='alex2',extra='sb')
])
session.commit()

  删 delete

#删除
session.query(Users).filter(Users.nid>2).delete()
session.commit()

  改 update

#改
session.query(Users).filter(Users.nid<2).update({Users.name:Users.name + '666'},synchronize_session=False)
session.commit()

  查 filter  filter_by

#查
r = session.query(Users).all()
print(r)
r2 = session.query(Users.name,Users.extra).all()
print(r2)
r3 = session.query(Users).filter_by(nid=2).all()
print(r3)
r4 = session.query(Users).filter_by(name='alex').first()
print(r4)

 

  

  

  

  

  

  

  

一篇搞定SQLAlchemy--关系对象映射的更多相关文章

  1. 一篇搞定RSA加密与SHA签名|与Java完全同步

    基础知识 什么是RSA?答:RSA是一种非对称加密算法,常用来对传输数据进行加密,配合上数字摘要算法,也可以进行文字签名. RSA加密中padding?答:padding即填充方式,由于RSA加密算法 ...

  2. 一:ORM关系对象映射(Object Relational Mapping,简称ORM)

    狼来的日子里! 奋发博取 10)django-ORM(创建,字段类型,字段参数) 一:ORM关系对象映射(Object Relational Mapping,简称ORM) ORM分两种: DB fir ...

  3. 关系/对象映射 多对多关系(@ManyToMany 注释)【重新认识】

    old: @ManyToMany 注释:表示此类是多对多关系的一边, mappedBy 属性定义了此类为双向关系的维护端, 注意:mappedBy 属性的值为此关系的另一端的属性名. 例如,在Stud ...

  4. 2021升级版微服务教程6—Ribbon使用+原理+整合Nacos权重+实战优化 一篇搞定

    2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...

  5. Python与数据库[2] -> 关系对象映射/ORM[0] -> ORM 与 sqlalchemy 模块

    ORM 与 sqlalchemy 1 关于ORM / About ORM 1.1 ORM定义 / Definition of ORM ORM(Object Relational Mapping),即对 ...

  6. Python与数据库[2] -> 关系对象映射/ORM[5] -> 利用 sqlalchemy 实现关系表查询功能

    利用 sqlalchemy 实现关系表查询功能 下面的例子将完成一个通过关系表进行查询的功能,示例中的数据表均在MySQL中建立,建立过程可以使用 SQL 命令或编写 Python 适配器完成. 示例 ...

  7. H5 拖拽,一个函数搞定,直接指定对象设置可拖拽

    页面上,弹个小窗体,想让它可以拖拽,又不想 加载一堆js,就简单的能让他可以拖动? 嗯,下面有这样一个函数,调用下就好了! 1. 先来说说 H5的 拖拽 在 HTML5 中,拖放是标准的一部分,任何元 ...

  8. Python与数据库[2] -> 关系对象映射/ORM[1] -> sqlalchemy 的基本使用示例

    sqlalchemy 的基本使用示例 下面的例子中将利用sqlalchemy进行数据库的连接,通过orm方式利用类实例属性操作的方式对数据库进行相应操作,同时应用一些常用的函数. 完整代码如下: fr ...

  9. Python与数据库[2] -> 关系对象映射/ORM[3] -> sqlalchemy 的声明层 ORM 访问方式

    sqlalchemy的声明层ORM访问方式 sqlalchemy中可以利用声明层进行表格类的建立,并利用ORM对象进行数据库的操作及访问,另一种方式为显式的 ORM 访问方式. 主要的建立步骤包括: ...

随机推荐

  1. Centos 7 安装 Mysql5.7(压缩包方式)

    今天装的了mysql,遇到了很多问题,好在最后一一解决了,现在记录在此,防止日后老路重走... 1.下载 当然是去官网,下一个linux下的版本,64位的 tar.gz,好吧这里贴个名字——[mysq ...

  2. (转)java 打印自身代码——真实世界不存在自指

    public class SelfPrint {      public static void main(String args[]) {          char s = 34;         ...

  3. 使用sql语句实现添加、删除约束

    --主键约束(Primary Key constraint):要求主键列的数据唯一,并且不允许为空. --唯一约束(Unique Constraint):要求该列唯一,允许为空,但只能出现一个空值. ...

  4. Hackerrank - Game Of Rotation 题解

    旋转一个数组以得到最大值. 陷阱就是:不能排序.须要模拟操作旋转,并设计公式计算旋转后的和. 要求是O(n)时间完毕. 原题: https://www.hackerrank.com/challenge ...

  5. 对象关系映射 EmitMapper 及Tuple的使用

    public TDestination Map<TSource, TDestination>(TSource tSource) { if (tSource == null) return ...

  6. 设计模式之里氏替换原则(LSP)

    在java等面向对象编程语言里面,我想继承性应该是一大特色吧!所以今天所要讲解的里氏替换原则主要是针对这一特性而提出来的,当我们定义对象的时候,尽量找出对象之间的相同点,然后将其抽象成基类对象.比如水 ...

  7. 详解TCP建立连接全过程

    TCP是因特网中的传输层协议,使用三次握手协议建立连接,下面是TCP建立连接的全过程. 上图画出了TCP建立连接的过程.假定主机A是TCP客户端,B是服务端.最初两端的TCP进程都处于CLOSED状态 ...

  8. hdu2049 不容易系列之(4)——考新郎 错排+组合 一共有N对新婚夫妇,N个新娘随机坐成一排,每个新郎只能选一个, 其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能.

    不容易系列之(4)——考新郎 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  9. hdu1695 GCD2 容斥原理 求x属于[1,b]与y属于[1,d],gcd(x,y)=k的对数。(5,7)与(7,5)看作同一对。

    GCD Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted Sub ...

  10. Vim使用技巧(4) -- 命令行模式 【持续更新】

    基本保存,退出,帮助 :help //帮助 :w //保存 :q //退出 :wq //保存后退出 :q! //强制不保存退出 %s/a/b/g //将当前文件的a全部替换成b /abc //正向查找 ...