SQLAlchemy基本使用,创建表,增删改查

基础语法

  • 创建连接
from sqlalchemy import create_engine
# 写法1
engine = create_engine("postgresql://scott:[email protected]/test?charset=utf8")

# 写法2
engine = create_engine("mysql+pymysql://root:[email protected]/test",encoding='latin1', echo=True")

URL的字符串形式是 dialect[+driver]://user:[email protected]/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:[email protected]/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:[email protected]/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:[email protected]/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:[email protected]/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:[email protected]/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:[email protected]/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:[email protected]/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:[email protected]/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:[email protected]/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)

原文地址:https://www.cnblogs.com/robertx/p/11122851.html

时间: 2024-08-04 07:26:27

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

Android(java)学习笔记245:ContentProvider之银行数据库创建和增删改查的实现

1.Android的四大组件: (1)Activity  用户交互的UI界面 (2)Service  后台运行的服务 (3)BroadcastReceiver 广播接收者 (4)ContentProvider  内容提供者 2. ContentProvider  内容提供者 用途:把应用程序私有的数据暴露给别的应用程序. 3.下面通过一个银行数据库创建和增删改查的实现案例说明ContentProvider的使用: (1)首先我们这里要用到数据库,首先我们必须先扩展一个抽象类SQLiteOpenH

mybatis(单表增删改查)

(mybatis注意各个文件的映射问题) 用到的t_user数据库脚本: -- 导出 mybatis 的数据库结构 CREATE DATABASE IF NOT EXISTS `mybatis` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `mybatis`; -- 导出 表 mybatis.t_user 结构 CREATE TABLE IF NOT EXISTS `t_user` ( `id` int(10) NOT NULL AUTO_INCREM

mybatis(单表增删改查useMapper版)

数据库脚本(注意测试时先add-->load-->update-->delete-->list)UserMapper版 -- -------------------------------------------------------- -- 主机: 127.0.0.1 -- 服务器版本: 5.5.36-MariaDB - mariadb.org binary distribution -- 服务器操作系统: Win32 -- HeidiSQL 版本: 8.0.0.4396 --

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

运行效果: 使用代码生成器(GZCodeGenerate)生成tb_EmpLeave的Model 生成器源代码下载地址: https://github.com/GarsonZhang/GZCodeGenerate/ 生成方式见上一节: GZFramwork数据库层<一>普通表增删改查     新增一个自定义控件:ucTableUnitDocNo   后台代码同上一节ucTableUnit除了实例化bllBusiness不一样外其他都一样(红色背景标注) using System; using

使用CI操作oracle 10g的单表增删改查

<?php if (!defined('BASEPATH'))    exit('No direct script access allowed'); class UseOra extends CI_Controller{ public function index()    {        echo '欢迎使用测试CI使用Oracle 10g 的功能,您可以在地址栏中使用如下的函数参数:<br>';        echo '=============================

再说“使用CI操作oracle 10g的单表增删改查”

--Control中的UseOra.php <?php if (!defined('BASEPATH'))    exit('No direct script access allowed'); class UseOra extends CI_Controller{ public function index()    {        echo '欢迎使用测试CI使用Oracle 10g 的功能,您可以在地址栏中使用如下的函数参数:<br>';        echo '=======

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

同GZFramwork数据库层<三>普通主从表增删改查   不同之处在于:实例 修改为:   直接上效果:         本系列项目源码下载地址:https://github.com/GarsonZhang/GZFramworkDBDemo/ 生成器源码下载地址:https://github.com/GarsonZhang/GZCodeGenerate/   系列文章 1. GZFramwork数据库层<前言>Demo简介 2. GZFramwork数据库层<前言>D

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

运行结果: 使用代码生成器(GZCodeGenerate)生成tb_Cusomer和tb_CusomerDetail的Model 生成器源代码下载地址: https://github.com/GarsonZhang/GZCodeGenerate/ 生成方式见第一节: GZFramwork数据库层<一>普通表增删改查   生成明细表ORM略有不同: 项目附加结果:   新增一个自定义控件:ucTableMD 界面:   后台代码: using System; using System.Colle

XML——对XML文档的创建与增删改查

原文:XML--对XML文档的创建与增删改查 一.创建的第一种方式  //1.创建一个XML文档 XmlDocument doc = new XmlDocument(); //2.创建第一行描述信息 XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null); //3.将创建的第一行描述信息添加到文档中 doc.AppendChild(dec); //4.给文档添加根节点 XmlElemen

【andorid基础篇】数据库的创建以及增删改查

I,安卓下的数据库 安卓下使用的数据库是SQLite,安卓为我们提供的API是SQLiteOpenHelper. 1,创建一个数据库 1)写一类去继承抽象类SQLiteOpenHelper,我们需要复写相关的方法: 1 public WcxSQLite(Context context, String name, CursorFactory factory,int version) { super(context, name, factory, version); 3 } 4 5 public v