基础语法

  • 创建连接
from sqlalchemy import create_engine
# 写法1
engine = create_engine("postgresql://scott:tiger@localhost/test?charset=utf8") # 写法2
engine = create_engine("mysql+pymysql://root:123@127.0.0.1/test",encoding='latin1', echo=True")

URL的字符串形式是 dialect[+driver]://user:password@host/dbname[?key=value..],在这里 dialect是一个数据库的名称,如mysqloraclepostgresql等等,和driver一个DBAPI的名称,诸如 psycopg2pyodbccx_oracle等。或者,该URL可以是一个实例。

  • 创建会话

    用来与数据库交谈,ORM对数据库的“处理”是Session。当我们第一次设置应用程序时,在与create_engine()语句相同的级别上,我们定义一个Session类,它将作为新Session 对象的工厂

from sqlalchemy import sessionmaker
Session = sessionmaker(bind=engine)
db_session = Session()

SQLAlchemy创建表,及简单的CRUD

1.创建表

# 1. 创建连接
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:123@127.0.0.1/test?charset=utf8') # 2. 创建基类, 相当于 django orm中的model.model
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base() from sqlalchemy import Column,Integer,String
# 3. 创建表模型
class User(Base):
__tablename__ = 'users'
id = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(32)) def __repr__(self):
return self.name Base.metadata.create_all(engine)

2.单表的CRUD

增加数据

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:123@127.0.0.1/test?charset=utf8') from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
db_session = Session() # 1. 添加单条数据
# u = User(name='用户1')
# db_session.add(u) # 2. 添加多条数据
db_session.add_all([
User(name='用户2'),
User(name='用户3'),
]) # 结束记得提交,数据才能保存在数据库中
db_session.commit()
# 关闭会话
db_session.close()

查询数据

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:123@127.0.0.1/test?charset=utf8') from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
db_session = Session() # 查询用户表中所有用户
user_all = db_session.query(User).all() # where条件查询
user = db_session.query(User).filter(User.id>=2).all()
# 取出一条数据
user = db_session.query(User).filter(User.id>=2).first() db_session.close()

修改数据

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:123@127.0.0.1/test?charset=utf8') from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
db_session = Session() # 更新单条数据
res = db_session.query(User).filter(User.id==20).update({"name":"新用户"})
db_session.commit()
db_session.close() # 更新多条数据
res2 = db_session.query(User).filter(User.id<=20).update({"name":"修改用户"})
print(res) # 这里结果的数字是更新的行数 db_session.commit()
db_session.close()

删除数据

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:123@127.0.0.1/test?charset=utf8') from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
db_session = Session() res = db_session.query(User).filter(User.id==20).delete() db_session.commit()
db_session.close()

复杂条件查询

# 1.and_ or_ 条件查询
from sqlalchemy.sql import and_,or_
ret = db_session.query(User).filter(and_(User.id>3,User.name=='xxx')).all()
ret2 = db_session.query(User).filter(or_(User.id<2,User.name=='xxx')).all() # 2. 查询所有数据
res = db_session.query(User).all() # 3. 查询数据,指定查询数据列加入别名
r3 = db_session.query(User.name.label('username'),User.id).firset()
print(r2.id,r2.username) # 4. 筛选条件格式
r4 = db_session.query(User).filte(User.name='xxx').all()
r5 = db_session.query(User).filter_by(name='xxx').first() # 6. 原生sql查询
r6 = db_session.query(User).from_statement(text("select * from User where name=:name")).params(name='xxx').all() # 7. 筛选查询列, query的时候不再使用User ORM对象,而是使用User.name来对内容进行选取
user_list = db_session.query(User.name).all()
print(user_list) for row in user_list:
print(row.name) # 8. 复杂查询
from sqlalchemy.sql import text
user_list = db_session.query(User).filter(text('select * from User id<:value and name=:name')).params(value=3,name='xxx') # 9. 排序
user_list = db_session.query(User).order_by(User.id.desc()).all() # 10. between 查询大于1小于3的
ret = session.query(User).filter(User.id.between(1, 3), User.name == 'xxx').all() # 11. in 只查询id等于1,3,4的
ret = session.query(User).filter(User.id.in_([1,3,4])).all() # 12. 取反 查询不等于1,3,4的
ret = session.query(User).filter(~User.id.in_([1,3,4])).all() # 13. 子查询
ret = session.query(User).filter(User.id.in_(session.query(User.id).filter_by(name='xxx'))).all() # 14. 通配符
ret = db_session.query(User).filter(~User.name.like('e%')).all() # 15. 限制
ret = db_session.query(User)[1:2] # 16. 分组
from sqlalchemy.sql import func
ret = db_session.query(User).group_by(User.extra).all()
ret = db_session.query(
func.max(User.id),
func.sum(User.id),
func.min(User.id)).group_by(User.name).having(func.min(User.id) >2).all()

复杂修改数据

#高级版更新操作
from my_create_table import User,engine
from sqlalchemy.orm import sessionmaker Session = sessionmaker(engine)
db_session = Session() #直接修改
db_session.query(User).filter(User.id > 0).update({"name" : "xxx"}) #在原有值基础上添加 方式1, 名字后面加后缀
db_session.query(User).filter(User.id > 0).update({User.name: User.name + "后缀"}, synchronize_session=False) #在原有值基础上添加 方式2, 年龄加一岁
db_session.query(User).filter(User.id > 0).update({"age": User.age + 1}, synchronize_session="evaluate")
db_session.commit()

3.一对多的操作 外键 Foreignkey

1.创建数据表及外键关系

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:123@127.0.0.1/test?charset=utf8') from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base() from sqlalchemy import Column,Integer,String,ForeignKey
from sqlalchemy.orm import relationship class Scholl(Base):
__tablename__ = 'school'
id = Column(Integer,primary_key=True)
name = Column(String(32)) class Student(Base):
__tablename__ = 'student'
id = Column(Integer,primary_key=True)
name = Column(String(32)) # 关联字段,让class_id 与 class 的 id 进行关联,主外键关系(这里的ForeignKey一定要是表名.id不是对象, 这是数据库层面的
school_id = Column(Integer,ForeignKey('school.id')) # orm层面的关系,数据库中不存在这个字段
to_school = relationship("School",backref='to_student') Base.metadata.create_all(engine)

添加数据

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:123@127.0.0.1/test?charset=utf8') from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base() from sqlalchemy import Column,Integer,String,ForeignKey
from sqlalchemy.orm import relationship class School(Base):
__tablename__ = 'school'
id = Column(Integer,primary_key=True)
name = Column(String(32)) class Student(Base):
__tablename__ = 'student'
id = Column(Integer,primary_key=True)
name = Column(String(32)) # 关联字段,让class_id 与 class 的 id 进行关联,主外键关系(这里的ForeignKey一定要是表名.id不是对象
school_id = Column(Integer,ForeignKey('school.id')) to_school = relationship("School",backref='to_student') # Base.metadata.create_all(engine) from sqlalchemy.orm import sessionmaker
Session = sessionmaker(engine)
db_session = Session() # 正向添加字段
s = Student(name='小明',to_school=School(name='太阳小学'))
s2 = Student(name='小亮',to_school=db_session.query(School).filter(School.name=='太阳小学').first())
db_session.add(s) # 反向添加字段
school = School(name='月亮小学')
school.to_student=[Student(name='xxx1'),Student(name='xxx2')]
db_session.add(school)
db_session.commit()

查询数据

# 正向查询
student_list = db_session.query(Student).all()
for stu in student_list:
print(stu.name,stu.to_school.name) # 反向查询
school_list = db_session.query(School).all()
for school in school_list:
print(school.name,end='')
for s in school.to_student:
print(s.name)

修改数据

school = db_session.query(School).filter(School.name=='太阳小学').first()
db_session.query(Student).filter(Student.school_id==school.id).update({'name':'太阳小学生'}) db_session.commit()

删除数据

school = db_session.query(School).filter(School.name=='太阳小学').first()
db_session.query(Student).filter(Student.id==school.id).delete() db_session.commit()
db_session.close()

3. 多对多关系

创建表及关系

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:123@127.0.0.1/test',encoding='utf8') from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() from sqlalchemy import Integer,Column,String,ForeignKey
from sqlalchemy.orm import relationship class Boy(Base):
__tablename__ = 'boy'
id = Column(Integer,primary_key=True)
name = Column(String(16)) to_girl = relationship('Boy',secondary='hotel',backref='to_boy') class Girl(Base):
__tablename__ = 'girl'
id = Column(Integer,primary_key=True)
name = Column(String(16)) class Hotel(Base):
__tablename__ = 'hotel'
id = Column(Integer,primary_key=True)
boy_id = Column(Integer,ForeignKey('boy.id'))
girl_id = Column(Integer,ForeignKey('girl.id')) Base.metadata.create_all(engine)

基于relationship增加数据 多对多

boy = Boy(name='男孩1')
boy.b_to_g = [Girl(name='女1'),Girl(name='女2')] db_session.add(boy)
db_session.commit()

基于relationship查询数据 多对多

# 创建连接
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:123@127.0.0.1/test?charset=utf8') from sqlalchemy.ext.declarative import declarative_base
# 创建基类
Base = declarative_base() from sqlalchemy import Integer,Column,String,ForeignKey
from sqlalchemy.orm import relationship
# 创建表关系
class Boy(Base):
__tablename__ = 'boy'
id = Column(Integer,primary_key=True)
name = Column(String(16)) b_to_g = relationship('Girl',secondary='hotel',backref='g_to_b') class Girl(Base):
__tablename__ = 'girl'
id = Column(Integer,primary_key=True)
name = Column(String(32)) def __repr__(self):
return self.name class Hotel(Base):
__tablename__ = 'hotel'
id = Column(Integer,primary_key=True)
boy_id = Column(Integer,ForeignKey('boy.id'))
girl_id = Column(Integer,ForeignKey('girl.id')) # Base.metadata.create_all(engine) from sqlalchemy.orm import sessionmaker
Session = sessionmaker(engine)
db_session = Session() # 正向查询
res = db_session.query(Boy).all()
for boy in res:
print(boy.id,boy.name,boy.b_to_g) # 反向查询
res = db_session.query(Girl).first()
for boy in res.g_to_b:
print(boy.id,boy.name)

SQLAlchemy基本使用,创建表,增删改查的更多相关文章

  1. share point CSOM 客户端模式 创建表 增删改查

    需要引用:Microsoft.SharePoint.Client ascx: <h4>CSOM所有表名</h4> <table> <tr> <td ...

  2. Android(java)学习笔记245:ContentProvider使用(银行数据库创建和增删改查的案例)

    1. Android的四大组件: (1)Activity  用户交互的UI界面 (2)Service  后台运行的服务 (3)BroadcastReceiver 广播接收者 (4)ContentPro ...

  3. Android(java)学习笔记189:ContentProvider使用(银行数据库创建和增删改查的案例)

    1. Android的四大组件: (1)Activity  用户交互的UI界面 (2)Service  后台运行的服务 (3)BroadcastReceiver 广播接收者 (4)ContentPro ...

  4. Django框架(八)--单表增删改查,在Python脚本中调用Django环境

    一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的setting中进行配置: 将DATABASES={} 更新为 DA ...

  5. Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境

    目录 单表增删改查,在Python脚本中调用Django环境 一.数据库连接配置 二.orm创建表和字段 三.单表增删改查 1.增加数据 2.删除数据 3.修改数据 4.查询数据 四.在Python脚 ...

  6. GZFramwork数据库层《四》单据主从表增删改查

    同GZFramwork数据库层<三>普通主从表增删改查 不同之处在于:实例 修改为: 直接上效果: 本系列项目源码下载地址:https://github.com/GarsonZhang/G ...

  7. GZFramwork数据库层《三》普通主从表增删改查

    运行结果: 使用代码生成器(GZCodeGenerate)生成tb_Cusomer和tb_CusomerDetail的Model 生成器源代码下载地址: https://github.com/Gars ...

  8. GZFramwork数据库层《二》单据表增删改查(自动生成单据号码)

    运行效果: 使用代码生成器(GZCodeGenerate)生成tb_EmpLeave的Model 生成器源代码下载地址: https://github.com/GarsonZhang/GZCodeGe ...

  9. GZFramwork数据库层《一》普通表增删改查

    运行结果:     使用代码生成器(GZCodeGenerate)生成tb_MyUser的Model 生成器源代码下载地址: https://github.com/GarsonZhang/GZCode ...

  10. Vc数据库编程基础MySql数据库的表增删改查数据

    Vc数据库编程基础MySql数据库的表增删改查数据 一丶表操作命令 1.查看表中所有数据 select * from 表名 2.为表中所有的字段添加数据 insert into 表名( 字段1,字段2 ...

随机推荐

  1. win10 uwp 使用 asp dotnet core 做图床服务器客户端

    原文 win10 uwp 使用 asp dotnet core 做图床服务器客户端 本文告诉大家如何在 UWP 做客户端和 asp dotnet core 做服务器端来做一个图床工具   服务器端 从 ...

  2. C#或者WPF中让某个窗体置顶

    原文:C#或者WPF中让某个窗体置顶 前记:在工作中有个需求,要求不管到那个界面,我必须让一个浮动条(其实是个窗体)置顶. 我用wpf,因为有之前有好几个界面已经设置成topmost了,所以在这几个界 ...

  3. HDU2665 Kth number 【合并树】

    Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  4. WinForm导出文件

    1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 ...

  5. UVALive 6485 Electric Car Rally (BFS,PQ)

    https://icpcarchive.ecs.baylor.edu/index.php? option=com_onlinejudge&Itemid=8&page=show_prob ...

  6. WPF 路由事件 Event Routing

    原文:WPF 路由事件 Event Routing 1.路由事件介绍 之前介绍了WPF的新的依赖属性系统,本篇将介绍更高级的路由事件,替换了之前的.net普通事件.相比.net的事件,路由事件具有更强 ...

  7. 脚本 启动/停止 jar包服务

    windows (.bat): @set port=8692 @echo %port% for /f "tokens=5" %%i in ('netstat -aon ^| fin ...

  8. QString转换为LPTSTR(使用了reinterpret_cast,真是叹为观止,但是也开阔了思路),三篇文章合起来的各种转换方法

    醉了,windows下宏定义了很多char类型 LPTSTR .今天,直接使用,qt报错,真TM费事. 将“CPU”转化为wcha_t * QString str = "CPU"; ...

  9. win10 uwp 萤火虫效果

    原文:win10 uwp 萤火虫效果 本文在Nukepayload2指导下,使用他的思想用C#写出来. 本文告诉大家,如何使用 win2d 做出萤火虫效果. 安装 win2d 安装win2d的方法请使 ...

  10. 芒果TV For Windows10 成长历史 & 迭代历史 & 新闻报道

    芒果TV 是国内领先的基于Windows10操作系统并支持Windows10全系列设备的视频应用和内容服务商. Win10商店版<芒果TV>是湖南快乐阳光互动娱乐传媒有限公司专门为Wind ...