day63

参考:http://www.cnblogs.com/wupeiqi/articles/5713330.html

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. ORM框架:SQLAlchemy
        - 作用:
            1. 提供简单的规则
            2. 自动转换成SQL语句
        
    
        - DB first: 手动创建数据库以及表          -> ORM框架 -> 自动生成类
        - code first: 手动创建类、和数据库        -> ORM框架 -> 以及表
        
        a. 功能
            - 创建数据库表
                - 连接数据库(非SQLAlchemy,pymyql,mysqldb,....)
                - 类转换SQL语句
            - 操作数据行
                增
                删
                改
                查
    
            - 便利的功能

 from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine Base = declarative_base()
class UsersType(Base):#必须继承base
__tablename__ = 'usertype'#表名 #自增
id = Column(Integer, primary_key=True, autoincrement=True)#生成三列 Column
title = Column(String(32), nullable=True, index=True)#建立索引 # 创建单表
class Users(Base):#必须继承base
__tablename__ = 'users'#表名 #自增
id = Column(Integer, primary_key=True, autoincrement=True)#生成三列 Column
name = Column(String(32), nullable=True, default='sf', index=True)#建立索引
extra = Column(String(16), unique=True)#唯一索引 user_type_id = Column(Integer, ForeignKey("usertype.id"))#建立外键 user_type_id对应usertype中的id __table_args__ = (
UniqueConstraint('id', 'name', name='uix_id_name'), #联合唯一索引
Index('ix_id_name', 'name', 'extra'), #普通索引
) #连远程 127.0.0.1本机 配置 #最多5个连接
engine = create_engine("mysql+pymysql://root:112358@127.0.0.1:3306/nzp?charset=utf8", max_overflow = 5)
Base.metadata.create_all(engine)

实现增、删、改、查

 from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine Base = declarative_base() class UsersType(Base):#必须继承base
__tablename__ = 'usertype'#表名 #自增
id = Column(Integer, primary_key=True, autoincrement=True)#生成三列 Column
title = Column(String(32), nullable=True, index=True)#建立索引 # 创建单表
class Users(Base):#必须继承base
__tablename__ = 'users'#表名 #自增
id = Column(Integer, primary_key=True, autoincrement=True)#生成三列 Column
name = Column(String(32), nullable=True, default='sf', index=True)#建立索引
extra = Column(String(16), unique=True)#唯一索引 user_type_id = Column(Integer, ForeignKey("usertype.id"))#建立外键 __table_args__ = (
UniqueConstraint('id', 'name', name='uix_id_name'), #联合唯一索引
Index('ix_id_name', 'name', 'extra'),#普通索引
) # #连远程 127.0.0.1本机 配置 #最多5个连接
# engine = create_engine("mysql+pymysql://root:112358@127.0.0.1:3306/nzp?charset=utf8", max_overflow = 5)
# Base.metadata.create_all(engine) #创建表
# #Base.metadata.drop_all(engine)# 删掉表 #建表
def create_db():
engine = create_engine("mysql+pymysql://root:112358@127.0.0.1:3306/nzp?charset=utf8", max_overflow=5)
Base.metadata.create_all(engine) # 创建表
#删表
def drop_db():
engine = create_engine("mysql+pymysql://root:112358@127.0.0.1:3306/nzp?charset=utf8", max_overflow=5)
Base.metadata.drop_all(engine) # 创建表 engine = create_engine("mysql+pymysql://root:112358@127.0.0.1:3306/nzp?charset=utf8", max_overflow=5)
Session = sessionmaker(bind=engine)
session = Session() # # 增
# # 添加一行
# # obj1 = UsersType(title="狗剩")#给usertype表添加
# # session.add(obj1)
# '''添加多行数据'''
# objs = [
# UsersType(title='tghh'),
# UsersType(title='sdcs'),
# UsersType(title='cbsu'),
# ]
# session.add_all(objs)
# session.commit() # #查
# user_type_list = session.query(UsersType).all()#其中每一个元素是UserType类型,每一个对象是一行数据
# print(type(user_type_list[0])) #row是UsersType类对象 ,类代指表
# for row in user_type_list:
# print(row.id, row.title) # #查部分 #相当于映射 #相当于where
# user_type_list = session.query(UsersType.id, UsersType.title).filter(UsersType.id > 2)#其中每一个元素是UserType类型,每一个对象是一行数据
# for row in user_type_list:
# print(row.id, row.title) # #删
# session.query(UsersType.id, UsersType.title).filter(UsersType.id > 2).delete()
# session.commit() #改
#session.query(UsersType.id, UsersType.title).filter(UsersType.id > 0).update({'title':"nizhipeng"})#批量更改
#session.query(UsersType.id, UsersType.title).filter(UsersType.id > 0).update({UsersType.title: UsersType.title+"x"}, synchronize_session=False)
session.query(UsersType.id, UsersType.title).filter(UsersType.id > 0).update({"title": UsersType.id + 1}, synchronize_session="evaluate")
session.commit()#需要确认 session.close()

其他:

 # 条件
#or,and,in,between
ret = session.query(Users).filter_by(name='alex').all()
ret = session.query(Users).filter(Users.id > 1, Users.name == 'eric').all()
ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all()
ret = session.query(Users).filter(Users.id.in_([1,3,4])).all()
ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all()
ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all()
from sqlalchemy import and_, or_
ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all()
ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all()
ret = session.query(Users).filter(
or_(
Users.id < 2,
and_(Users.name == 'eric', Users.id > 3),
Users.extra != ""
)).all() # 通配符
ret = session.query(Users).filter(Users.name.like('e%')).all()
ret = session.query(Users).filter(~Users.name.like('e%')).all()#非 # 限制
ret = session.query(Users)[1:2] #切片limit # 排序
ret = session.query(Users).order_by(Users.name.desc()).all()
ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all() # 分组
from sqlalchemy.sql import func ret = session.query(Users).group_by(Users.extra).all()
ret = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)).group_by(Users.name).all() ret = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all()#通过名字分组 # 连表
ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all() ret = session.query(Person).join(Favor).all() ret = session.query(Person).join(Favor, isouter=True).all() #out join # 组合
q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union(q2).all()#上下连接 去重 q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union_all(q2).all() # 不去重

其中连表:

改变左右参数顺序,可设置right join或left join。

 from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine Base = declarative_base() class UsersType(Base):#必须继承base
__tablename__ = 'usertype'#表名 #自增
id = Column(Integer, primary_key=True, autoincrement=True)#生成三列 Column
title = Column(String(32), nullable=True, index=True)#建立索引 # 创建单表
class Users(Base):#必须继承base
__tablename__ = 'users'#表名 #自增
id = Column(Integer, primary_key=True, autoincrement=True)#生成三列 Column
name = Column(String(32), nullable=True, default='sf', index=True)#建立索引
extra = Column(String(16), unique=True)#唯一索引 user_type_id = Column(Integer, ForeignKey("usertype.id"))#建立外键 __table_args__ = (
UniqueConstraint('id', 'name', name='uix_id_name'), #联合唯一索引
Index('ix_id_name', 'name', 'extra'),#普通索引
) # #连远程 127.0.0.1本机 配置 #最多5个连接
# engine = create_engine("mysql+pymysql://root:112358@127.0.0.1:3306/nzp?charset=utf8", max_overflow = 5)
# Base.metadata.create_all(engine) #创建表
# #Base.metadata.drop_all(engine)# 删掉表 #建表
def create_db():
engine = create_engine("mysql+pymysql://root:112358@127.0.0.1:3306/nzp?charset=utf8", max_overflow=5)
Base.metadata.create_all(engine) # 创建表
#删表
def drop_db():
engine = create_engine("mysql+pymysql://root:112358@127.0.0.1:3306/nzp?charset=utf8", max_overflow=5)
Base.metadata.drop_all(engine) # 创建表 engine = create_engine("mysql+pymysql://root:112358@127.0.0.1:3306/nzp?charset=utf8", max_overflow=5)
Session = sessionmaker(bind=engine)
session = Session() # #连表
# result = session.query(Users).join(UsersType).all()#INNER JOIN usertype ON usertype.id = users.user_type_id
# print(result) # #子查询
# #select * from (select * from tb) as B
# q1 = session.query(UsersType).filter(UsersType.id > 2).subquery()#子查询 #当做一张表
# result = session.query(q1).all()
# print(result) # #select id, (select id from where user.user_type_id = 1) from xxx;
# result = session.query(UsersType.id, session.query(Users).filter(Users.id == 1).subquery()).all()
# #UsersType.id 加上 Users的第一行
# for row in result:
# print(row) #select * from users where users.user_type_id = usertype.id;
result = session.query(UsersType.id, session.query(Users).filter(Users.user_type_id == UsersType.id).as_scalar())#作为一项
#session.query(Users).as_scalar()#作为一项#带括号(SELECT users.id, users.name, users.extra, users.user_type_id FROM users)
print(result) session.close()

以上为连表与子查询。

relationship

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine Base = declarative_base() class UsersType(Base):#必须继承base
__tablename__ = 'usertype'#表名 #自增
id = Column(Integer, primary_key=True, autoincrement=True)#生成三列 Column
title = Column(String(32), nullable=True, index=True)#建立索引 # 创建单表
class Users(Base):#必须继承base
__tablename__ = 'users'#表名 #自增
id = Column(Integer, primary_key=True, autoincrement=True)#生成三列 Column
name = Column(String(32), nullable=True, default='sf', index=True)#建立索引
extra = Column(String(16), unique=True)#唯一索引 user_type_id = Column(Integer, ForeignKey("usertype.id"))#建立外键 __table_args__ = (
UniqueConstraint('id', 'name', name='uix_id_name'), #联合唯一索引
Index('ix_id_name', 'name', 'extra'),#普通索引
) user_type = relationship('UsersType')
# #连远程 127.0.0.1本机 配置 #最多5个连接
# engine = create_engine("mysql+pymysql://root:112358@127.0.0.1:3306/nzp?charset=utf8", max_overflow = 5)
# Base.metadata.create_all(engine) #创建表
# #Base.metadata.drop_all(engine)# 删掉表 #建表
def create_db():
engine = create_engine("mysql+pymysql://root:112358@127.0.0.1:3306/nzp?charset=utf8", max_overflow=5)
Base.metadata.create_all(engine) # 创建表
#删表
def drop_db():
engine = create_engine("mysql+pymysql://root:112358@127.0.0.1:3306/nzp?charset=utf8", max_overflow=5)
Base.metadata.drop_all(engine) # 创建表 engine = create_engine("mysql+pymysql://root:112358@127.0.0.1:3306/nzp?charset=utf8", max_overflow=5)
Session = sessionmaker(bind=engine)
session = Session() # 问题1. 获取用户信息以及与其关联的用户类型名称(FK,Relationship=>正向操作)
user_list = session.query(Users)
for row in user_list:
print(row.name, row.id, row.user_type.title)#row.user_type直接在usertype中将对应的title数据找到了 # 问题2. 获取用户类型
type_list = session.query(UsersType)
for row in type_list:
print(row.id, row.title, session.query(Users).filter(Users.user_type_id == row.id).all()) # type_list = session.query(UserType)
# for row in type_list:
# print(row.id,row.title,row.xxoo) session.close()

也可参考:https://www.jianshu.com/p/9771b0a3e589

MySQL(ORM框架)的更多相关文章

  1. MySQL—ORM框架,sqlalchemy模块

    武老师博客:ORM框架介绍 import os #1.当一类函数公用同样参数时候,可以转变成类运行 - 分类 #2.面向对象: 数据和逻辑组合在一起了 #3. 一类事物共同用有的属性和行为(方法) # ...

  2. mysql ORM框架及SQLAlchemy

    一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取 ...

  3. Python操作mysql之SQLAchemy(ORM框架)

    SQLAchemy SQLAchemy 解析: SQLAchemy是python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作, 简言之便是:将对象转换成SQ ...

  4. MySQL之ORM框架SQLAlchemy

    一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取 ...

  5. MySQL 第八篇:ORM框架SQLAlchemy

    一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取 ...

  6. mysql八:ORM框架SQLAlchemy

    阅读目录 一 介绍 二 创建表 三 增删改查 四 其他查询相关 五 正查.反查 一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进 ...

  7. Mysql(八):ORM框架SQLAlchemy

    一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取 ...

  8. Django(三) 模型:ORM框架、定义模型类并创建一个对应的数据库、配置Mysql数据库

    一.模型概述 https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial02/ https://www.runoob.com/django/dj ...

  9. 冰冻三尺非一日之寒-mysql(orm/sqlalchemy)

    第十二章  mysql ORM介绍    2.sqlalchemy基本使用 ORM介绍: orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似pyt ...

随机推荐

  1. Golang之并发篇

    进程和线程 A.进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位. B.线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. C.一 ...

  2. 品味性能之道<六>:图形化SQL分析工具

         在上一章里,重点分享了命令行SQL分析工具的使用方法.在本章将重点分享PL/SQL的SQL分析工具. 一.如何打开PL/SQL执行计划      开启PL/SQL这工具,推荐如下方法: 点击 ...

  3. 删除pdf文件所有超链接

    最近在读deep learning 书Bengio那本,在Github上面下载的,下载回来全都是超链接, 超级烦,比如点一下梯度下降法,就直接跳转到数后尾的index. 我看书还喜欢老点,所以要把他们 ...

  4. Selenium安装中的一些问题及解决办法-软硕1703班3组整理分享

    非常感谢软件工程硕士1703班3组同学的热心,他们将安装Selenium过程中踩过的坑替大家填上了.希望还没有来得及踩坑的,或者掉进坑里还没爬出来的小组,能顺利跨过去这个安装的坑. 如下是原文. Se ...

  5. 2018.07.04 POJ 1654 Area(简单计算几何)

    Area Time Limit: 1000MS Memory Limit: 10000K Description You are going to compute the area of a spec ...

  6. 2018.07.12 atcoder Go Home(贪心)

    传送门 题意简述:大家在数轴上生活,公司在 s. 班车送所有人回家,有 n 个住处,第 i 个位置在 xi,居住了 pi 的人. 保证 xi 互不相同. 大家⼀起投票向前还是向后,如果票数相同就固定向 ...

  7. 用Java操作数据库Datetime数据

    Date.Calendar.Timestamp的区别.相互转换与使用 1 Java.util.Date 包含年.月.日.时.分.秒信息. // String转换为Date String dateStr ...

  8. 【redis】linux上的安装与配置(详细图解)

    转载自:https://blog.csdn.net/yjqyyjw/article/details/73293455:经过个人测试也适用于当前最新稳定的3.x的版本,顺便填了几个坑. 1.下载 htt ...

  9. mysql图文安装教程(win7 32位 亲测)

    一.下载mysql:http://www.mysql.com/downloads/ 弹出: 你需要有一个 Oracle Web 帐户,没有的话,注册一个: 勾选许可: 输入搜索条件: 下载MySQL ...

  10. 20155302 2016-2017-2 《Java程序设计》第六周学习总结

    20155302 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入 ...