当前位置: 首页 > news >正文

sqlalchemy orm查询语法与多对多外键关系relationship使用

创建数据库连接

SQLAlchemy连接到数据库,我们需要创建一个Engine对象。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String

# 创建基类
Base = declarative_base()

# 定义模型
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

# 创建数据库引擎和会话
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

查询语句

# 查询

查询所有用户数据
session.query(User).all() ==> [user1,user2]

查询有多少个用户
session.query(User).count()

查询第1个用户
session.query(User).first()

查询id为4的用户[3种方式]
session.query(User).get(4) (这里面只能是数字 或 ‘4’) 查询不到不会报错
session.query(User).filter_by(id = 4).first() (一个等号)查询不到不会报错
session.query(User).filter(User.id == 4).first()  查询不到不会报错

filter方法实现的:
1. equals : ==
    news= session.query(News).filter(News.title == "title1").first()
    query里面是列查询,字段,传入模型名表示全字段 。
    filter是行查询,没有filter表示全表查询
2. not equals  :  !=
    query(User).filter(User.name != 'ed')

3. like[不区分大小写]  & ilike[区分大小写]:
    query(User).filter(User.name.like('%ed%··')) 
 query(User).filter(User.name.like('__ed%__')) _表示站位符

4. in:
    query(User).filter(User.name.in_(['ed','wendy','jack']))

5. not in:
    query(User).filter(~User.name.in_(['ed','wendy','jack']))

6.  is null:
    query(User).filter(User.name==None)
    # 或者是
    query(User).filter(User.name.is_(None))

7. is not null:
    query(User).filter(User.name != None)
    # 或者是
    query(User).filter(User.name.isnot(None))

8. and:
    query(User).filter(and_(User.name=='ed',User.fullname=='Ed Jones'))
    # 或者是传递多个参数
    query(User).filter(User.name=='ed',User.fullname=='Ed Jones')
    # 或者是通过多次filter操作
    query(User).filter(User.name=='ed').filter(User.fullname=='Ed Jones')
9. or:
    query(User).filter(or_(User.name=='ed',User.name=='wendy'))

10. order_by
查询所有用户数据,并以邮箱排序
session.query(User).order_by(User.email).all()
session.query(User).order_by(User.email.desc()).all()

11. 查询名字结尾字符为g的所有数据[开始/包含]
session.query(User).filter(User.name.endswith('g')).all()
session.query(User).filter(User.name.startswith('g')).all()
session.query(User).filter(User.name.contains('g')).all()


每页3个,查询第2页的数据
paginate = session.query(User).paginate(page, per_page,Error_out)
paginate = session.query(User).paginate(2,3,False)
page: 哪一个页
per_page: 每页多少条数据
Error_out: False 查不到不报错

paginate .pages: 共有多少页
paginate .items: 当前页数的所有对象
paginate .page: 当前页
sqlalchemy查询常见的过滤方式
filter过滤条件:
过滤是数据提取的一个很重要的功能,以下对一些常用的过滤条件进行解释,并且这些过滤条件都是只能通过

如果想要查看orm底层转换的sql语句,可以在filter方法后面不要再执行任何方法直接打印就可以看到了。比如:
news = session.query(News).filter(or_(News.title=='abc',News.content=='abc'))
print(news)

增加

# 增加
user = User(name='laowang')
session.add(user)
session.commit()
# 新增多条数据
user_obj1 = User(name="bigberg", passwd="twgdh123")
user_obj2 = User(name="someone", passwd="twgdh123")
Session.add_all([user_obj1,user_obj2])
# 批量新增方式一
session.bulk_save_objects(
    [
        User(username=username + str(i), password=password)
        for i in range(10000)
    ]
)
session.commit()
# 批量新增方式二
session.bulk_insert_mappings(
    User,
    [
        dict(username="NAME INSERT " + str(i), password=password)
        for i in range(10000)
    ]
)
session.commit()
# 批量新增方式三
session.execute(
    User.__table__.insert(),
    [{"username": 'Execute NAME ' + str(i), "password": password} for i in range(10000)]
)
db.session.commit()

修改

# 修改
session.query(AiQuestionSortSse).filter(AiQuestionSortSse.id.in_(id_list)).update({"ptime": datetime.now()})
session.commit()

删除

# 删除
session.query(TaskSubOriginQuestion).where(TaskSubOriginQuestion.id.in_(ids)).delete()
session.commit()

SQLAlchemy:执行原生 SQL 语句

# 方式一使用engine
# 创建 Engine 后,使用 connect() 方法获取一个连接(Connection)对象,它提供了 execute() 方法来运# 行 SQL 语句:
from sqlalchemy import text

with engine.connect() as connection:
    result = connection.execute(text("SELECT * FROM users WHERE id=:user_id"), {"user_id": 1})
    for row in result:
        print(row)
# 方式二使用 session
result = session.execute(text("SELECT * FROM users WHERE id=:user_id"), {"user_id": 1})
for row in result:
    print(row)

session.close()

# 更新和插入
session.execute(text("UPDATE users SET name=:name WHERE id=:user_id"), {"name": "Alice", "user_id": 1})
session.commit()
session.execute(text("DELETE FROM users WHERE id=:user_id"), {"user_id": 1})
session.commit()

相关文章:

  • Redis高频面试题(含答案)
  • 嵌入式C语言 - 计算机存储体系与32位CPU寻址能力解析
  • 【Redis】数据结构和内部编码
  • 轨道力学课程习题集
  • PDF解析示例代码学习
  • 《Mycat核心技术》第22章:搭建Mycat+Zookeeper+HAProxy+Keepalived+MySQL高可用架构
  • 如何使用 ONLYOFFICE 恢复之前的文件版本?
  • 5分钟学会接口自动化测试框架
  • 巴西pwa游戏出海推广本土网盟cpi广告优势
  • 深度解析Redis过期字段清理机制:从源码到集群化实践 (一)
  • 如何使用通义灵码玩转Docker - AI助手提升开发效率
  • Oracle 分析函数(Analytic Functions)
  • 调不出来的问题记录(链式前向星+拓扑排序)
  • CFD中的动量方程非守恒形式详解
  • MTK Android12-13 -Intent Filter Verification Service 停止运行
  • 深度学习之线性代数基础
  • 算法——BFS
  • SQL Server 2014 利用SubString获取Json格式指定字段数据
  • 微信小程序无缝衔接弹幕效果纯CSS
  • JAVA Web_定义Servlet2_学生登录验证Servlet
  • MSCI中国指数5月调整:新增5只A股、1只港股
  • 沙青青评《通勤梦魇》︱“人机组合”的通勤之路
  • 央媒评网红质疑胖东来玉石定价暴利:对碰瓷式维权不能姑息
  • 体坛联播|安切洛蒂执掌巴西男足,字母哥尝试离开雄鹿
  • 山东鄄城发生一起交通事故,造成4人死亡、2人受伤
  • 再获殊荣!IP SH跻身上海文化品牌全球传播力TOP 6