Sqlalchemy功能整理

Sqlalchemy增删改查

实例模型

from sqlalchemy import Column, Integer, String

# Column 是字段的意思 一列一列的那个
# Integer 代表的是数据类型
# primary_key 代表的是主键
# autoincrement 自增
# index 为索引

class User(Base): #这仅仅是一个类名,不是我们的表名
    __tablename__ = "user"
    id = Column(Integer,primary_key=True,autoincrement=True)
    name = Column(String(32), index=True)

插入多条数据

  • 插入一条数据我们使用的是add(对象)
  • 插入多条数据我们用的是add_all(对象列表)
  • 插入多条数据推荐bulk_save_objects or bulk_insert_mappings

具体的代码操作:

from sqlalchemy.orm import sessionmaker
Session_window = sessionmaker(engine)  # 询问你已经创建完查询窗口,是否打开

db_session = Session_window()  # 打开查询窗口
user_obj_list = [User(name="林丹"),User(name="谌龙")]

db_session.add_all(user_obj_list) # 注意这里使用的是add_all
db_session.commit()
db_session.close()  # 关闭窗口

对象多的情况推荐使用db_session.bulk_save_objects(user_obj_list)
或者考虑bulk_insert_mappings
代码:
db_session.bulk_insert_mappings(
            User,
            [
                dict(name="NAME " + str(i))
                for i in xrange(chunk, min(chunk + 10000, n))
            ]
        )
db_session.commit()

查询数据

# 1. 查询第一条数据
user = db_session.query(User).first()
# 2. 查询所有数据
user_ogj_list = db_session.query(User).all()
# 3. 过滤查询
user_obj_list = db_session.query(User).filter(User.id <= 2).all()
user_obj_list = db_session.query(User).filter(User.id <= 2,User.name == "cyx").all()

更新数据

# 1. 单条
user_obj = db_session.query(User).filter(User.id==1).update({"name":"cyx123"})
# 2. 多条
user_obj = db_session.query(User).filter(User.id>1).update({"name":"666"})

删除数据

# 1. 单条
res = db_session.query(User).filter(User.id==1).delete()
# 2. 多条
res = db_session.query(User).filter(User.id>=1).delete()
# 3. 批量删除数据、全量删除
解决:使用参数synchronize_session=False,或for循环
方法:
users = self.db.query(User).filter(User.id.in_(1,2,3)).all()
[self.db.delete(u) for u in users]
或
session.query(Xsj28).filter(Xsj28.data_id.in_([111333, 111444])).delete(synchronize_session=False)
# 注意: 如果session.query(User).filter(User.id.in_((1, 2, 3))).delete()不使用synchronize_session时
# 会报错sqlalchemy.exc.InvalidRequestError: Could not evaluate current criteria in Python.  
# Specify 'fetch' or False for the synchronize_session parameter.
# 此外,update 操作也有同样的参数,如果后面立刻提交了,那么加上 synchronize_session=False 参数会更快

session.query(User).filter(or_(User.id == 1, User.id == 2, User.id == 3)).delete()

一对多(ForeignKey)

class Student(Base):
    __tablename__= "student"
    id = Column(Integer,primary_key=True)
    name = Column(String(32))
    school_id = Column(Integer,ForeignKey("school.id"))  # 因为是要去找数据库里面表的id,所以是表名不是类名
                                                        #外键关联到school的主键

class School(Base):
    __tablename__= "school"
    id = Column(Integer,primary_key=True)
    name = Column(String(32))


# 1. 正向添加数据
stu_obj = Student(name="cyx",stu2sch=School(name="南苑"))
# 2. 反向添加数据
sch_obj = School(name="南苑2号")
student_list = [Student(name="张老板"),Student(name="张老板的小弟")]
sch_obj.sch2stu = student_list
db_session.add(sch_obj)
db_session.commit()
# 3. 正向查询
stu_obj = db_session.query(Student).filter(Student.name=="张老板").first()
# 4. 反向查询
sch_obj_list = db_session.query(School).all() # 首先将所有学校找到
for row in sch_obj_list: # 将每一个学校进行循环
    for stu in row.sch2stu: # 将每一个学校的学生进行循环
        print(row.name,stu.name) # 答应学校和学生的名字

多对多

class Girls(Base):
    __tablename__ = "girl"
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    g2b = relationship("Boys", backref="b2g", secondary="hotel")  # seconder是媒婆

class Boys(Base):
    __tablename__ = "boy"
    id = Column(Integer, primary_key=True)
    name = Column(String(32))

class Hotel(Base):
    """
    第三张表我们只想建立关系,关于relationship我们并不想放在这里
    原因是我们的relationship是通过boy找到girl,通过girl找到boy
    跟Hotel是你没有任何的关系
    """
    __tablename__ = "hotel"
    id = Column(Integer, primary_key=True)
    boy_id = Column(Integer, ForeignKey("boy.id")) # 这两行表示发生过关系的男女
    girl_id = Column(Integer, ForeignKey("girl.id"))

 # 1. 正向添加
girl_obj = Girls(name="zly")
girl_obj.g2b = [Boys(name="cyx")] # 因为是多对多的关系,所以要列表
db_session.add(girl_obj)
# 2. 反向添加
boy_obj = Boys(name="男一号")
boy_obj.b2g = [Girls(name="女一号"),Girls(name="女二号")]
db_session.add(boy_obj)
# 3. 正向查询
girl_obj_list = db_session.query(Girls).all()
for girl in girl_obj_list:
    for boy in girl.g2b:
        print(girl.name, boy.name)
# 4. 反向查询
boy_obj_list = db_session.query(Boys).all()
for boy in boy_obj_list:
    for girl in boy.b2g:
        print(boy.name, girl.name)

高级操作

# 高级版查询操作,厉害了哦
#老规矩
from my_create_table import User,engine
from sqlalchemy.orm import sessionmaker

Session = sessionmaker(engine)
db_session = Session()

# 查询数据表操作
# and or
from sqlalchemy.sql import and_ , or_
ret = db_session.query(User).filter(and_(User.id > 3, User.name == 'Dragon')).all()
ret = db_session.query(User).filter(or_(User.id < 2, User.name == 'Dragon')).all()

# 查询数据 指定查询数据列 加入别名
r2 = db_session.query(User.name.label('username'), User.id).first()
print(r2.id,r2.username) # 15 NBDragon

# 原生SQL筛选条件
r4 = db_session.query(User).filter_by(name='Dragon').all()
r5 = db_session.query(User).filter_by(name='Dragon').first()

# 字符串匹配方式筛选条件 并使用 order_by进行排序
r6 = db_session.query(User).filter(text("id<:value and name=:name")).params(value=224, name='DragonFire').order_by(User.id).all()

#原生SQL查询
r7 = db_session.query(User).from_statement(text("SELECT * FROM User where name=:name")).params(name='Dragon').all()

# 别名映射  name as nick
user_list = db_session.query(User.name.label("nick")).all()
print(user_list)
for row in user_list:
    print(row.nick) # 这里要写别名了

# 复杂查询
from sqlalchemy.sql import text
user_list = db_session.query(User).filter(text("id<:value and name=:name")).params(value=3,name="Dragon")

# 查询语句
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="DragonFire")

# 排序 :
user_list = db_session.query(User).order_by(User.id).all()
user_list = db_session.query(User).order_by(User.id.desc()).all()
for row in user_list:
    print(row.name,row.id)

# 关闭连接
db_session.close()

高级修改数据

#高级版更新操作
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" : "099"})

#在原有值基础上添加 - 1
db_session.query(User).filter(User.id > 0).update({User.name: User.name + "099"}, synchronize_session=False)

#在原有值基础上添加 - 2
db_session.query(User).filter(User.id > 0).update({"age": User.age + 1}, synchronize_session="evaluate")
db_session.commit()

添加新评论

本站现已启用评论投票,被点踩过多的评论将自动折叠。与本文无关评论请发留言板。请不要水评论,谢谢。

已有 0条评论