基础语法

  • 创建连接
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. 封装QtCore(在非Qt项目里使用QString,QJson,QFileInfo,QFile等类)

    单独封装QtCore 一直以来使用QT的特性使用惯了,很多东西QT都封装得很好.如果突然有一天,不使用QT开发了,是不是不习惯. 比如我们经常使用QString很多方法,string,wstring之 ...

  2. .NET/C# 使窗口永不激活(No Activate 永不获得焦点)

    原文 .NET/C# 使窗口永不激活(No Activate 永不获得焦点) 有些窗口天生就是为了辅助其它程序而使用的,典型的如“输入法窗口”.这些窗口不希望抢夺其它窗口的焦点. 有 Win32 方法 ...

  3. LeetCode OJ平台Sort Colors讨论主题算法

    原题如下面,这意味着无序排列(由0,1,2组成).一号通.组织成若干阵列0-几个1-几个2这样的序列. Given an array with n objects colored red, white ...

  4. 如何诊断rac环境sysdate 返回的时间错误

    最近处理了若干rac环境访问sysdate错误的时间返回.而这个问题通常是一个数据库链接是由现在Listener创建的情况下.并且.大部分情况下都是和时区设置相关的.在这篇文章中我们会针对怎样诊断这样 ...

  5. apt-spy 软件源更新

    ebian上的apt-get是最快的软件安装方式,不过要用好apt-get,首先得需要找到最快的源,这样安装软件的时候才能获得好的速度,用起来才能得心应手. 有的源在用了一段以后,就会失效,这个时候, ...

  6. ajax默认form表单提交,导致实体不识别

    出现位置:实体比较复杂,包含List之类的时候 public class AdvertisementType { /// <summary> /// 广告位名称 /// </summ ...

  7. WPF DataTemplateSelector的使用

    <Window x:Class="CollectionBinding.MainWindow"        xmlns="http://schemas.micros ...

  8. WPF MVVM+EF 增删改查 简单示例(一)

    实现了那些功能,先看看效果图: 项目工程目录: 接下来开始具体的步骤: 第一步:在VS中新建工程 第二步:使用NuGet 安装EntityFramework 第三步:使用NuGet 安装EntityF ...

  9. 用友u8各版本在输出的时候报错提示:外部数据库驱动程序(1)中的意外错误

    从10月12日起很多U8用户反馈,在各版本U8中输出报表时软件报错,报错内容“外部数据库驱动程序(1)中的意外错误”,经初步分析有以下解决方案:1.卸载微软的补丁:(1)如果是PC操作系统(一般是客户 ...

  10. Win10《芒果TV》春季商店版更新v3.3.0:全新视觉蜕变&支持快男直播

    在微软发布Win10创意者更新正式版前夕,Win10版<芒果TV>迅速更新至v3.3.0,主要是全新升级视觉交互,新增大咖快男个人直播,全面优化底层架构,启动大提速. Win10版< ...