PythonBaby

导航

统计

ORM框架SQLAlchemy

安装:  pip install sqlalchemy

环境:Win10X64、Python3.9.0、SQLAlchemy1.4.26

文档:https://www.osgeo.cn/sqlalchemy/

复制代码
  1 import pymysql
  2 pymysql.install_as_MySQLdb()
  3 from sqlalchemy import create_engine
  4 from sqlalchemy.ext.declarative import declarative_base
  5 from sqlalchemy import text, ForeignKey, Column, Integer, String, DateTime, Boolean, Enum, DECIMAL, Text
  6 from sqlalchemy.sql import func
  7 from sqlalchemy.orm import sessionmaker
  8 
  9 # create_engine()用来初始化数据库连接
 10 # 数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名
 11 engine = create_engine('mysql://root:root@localhost:3306/sakila')
 12 Base = declarative_base()  # SQLORM基类
 13 
 14 Session = sessionmaker(bind=engine)  # 构建session对象
 15 """
 16 session不是线程安全的,并且我们一般session对象都是全局的,那么在多线程情况下,当多个线程共享一个session时,数据处理就会发生错误。
 17 为了保证线程安全,需使用scoped_session方法:
 18 Session = scoped_session(sessionmaker(bind=engine))
 19 """
 20 
 21 class News(Base):
 22     __tablename__ = 'news'  # 表的名字
 23 
 24     id = Column(Integer, primary_key=True,autoincrement=True)
 25     title = Column(String(200), nullable=False)
 26     content = Column(Text)
 27     # server_default只接收字符串类型的值,并不接受整型或者布尔型的值,需要用text来转换,如果是整型则写成字符串形式如server_default='123'
 28     is_valid = Column(Boolean, server_default=text('True'))
 29     created_at = Column(DateTime, server_default=func.now())  # DateTime默认值需要使用func.now()
 30     # language = Column(Enum('中文', '英文'), default='中文')  # default能设置数据值,但不能修改表结构,因此用server_default
 31     language = Column(Enum('中文', '英文'), server_default='中文')
 32 
 33 
 34 Base.metadata.create_all(engine)  # 将模型映射到数据库中
 35 
 36 
 37 class OrmTest():
 38     def __init__(self):
 39         self.session = Session()
 40 
 41     def add_one(self):
 42         new_obj = News(title='心态炸了!', content='琼斯倒地护球C罗吃到黄牌')
 43         self.session.add(new_obj)  # 添加到session
 44         self.session.commit()  # 提交到数据库
 45         return new_obj
 46 
 47     def add_all(self):
 48         objs = [
 49             News(title='赛季第3次首发?', content='武磊终迎上位最佳机会'),
 50             News(title='一语双关!', content='山东泰山发布足协杯战武汉海报:气冲霄汉'),
 51         ]
 52         self.session.add_all(objs)  # 批量添加数据
 53         self.session.commit()  # 提交到数据库
 54         return objs
 55 
 56     def get_one(self):
 57         return self.session.query(News).get(3)  # 根据主键来返回查询结果
 58         # get()、scalar()、one()、one_or_none() 都是返回一个查询结果
 59         # get 根据主键返回结果,没有该主键的结果返回None
 60         # scalar 没有结果返回None,多个结果则抛出sqlalchemy.orm.exc.MultipleResultsFound异常
 61         # one 没结果抛出sqlalchemy.orm.exc.NoResultFound异常,多个结果则抛出sqlalchemy.orm.exc.MultipleResultsFound异常
 62         # one_or_none 查询不到任何结果时不抛出异常而是返回None
 63 
 64     def get_more(self):
 65         return self.session.query(News).all() # all 返回查询到的所有的结果,没有则返回空列表
 66         self.session.query(News.id, News.title, News.content).all()  # 指定查询列
 67         self.session.query(News).first()  # 第一行
 68         self.session.query(News).filter(News.id > 10)  # 筛选过滤
 69         # 多个查询条件(and和or)
 70         self.session.query(News).filter(News.id > 10, New.id != 20)  # 在filter()中用, 分隔多个条件表示and
 71         from sqlalchemy import or_
 72         self.session.query(News).filter( or_(News.id > 10, New.is_valid == False))  # 使用or_连接多个条件
 73         self.session.query(News).filter(News.title.like('%最佳%'))  # like
 74         self.session.query(News).filter(News.language.in_(['中文', '英文']))  # in
 75         self.session.query(News).filter_by(is_valid=True)  # filter_by只接受键值对参数,不推荐使用
 76         self.session.query(News).order_by(News.id.desc())  # desc()表示倒序
 77         self.session.query(News).count()  # 计算个数
 78         self.session.query(News).all()[:2]  # 切片
 79 
 80     def update_data(self):
 81         obj = self.session.query(News).get(7)  # 先把数据查询出来
 82         obj.is_valid = 0  # 再修改
 83         self.session.add(obj)
 84         self.session.commit()
 85         return obj
 86 
 87     def update(self):
 88         obj = self.session.query(News).filter(News.id==10).update({''})  # 先把数据查询出来
 89         obj.is_valid = 0  # 再修改
 90         self.session.add(obj)
 91         self.session.commit()
 92         return obj
 93 
 94     def delete_data(self):
 95         data = self.session.query(News).get(4)  # 获取要删除的数据
 96         self.session.delete(data)
 97         self.session.commit()
 98 
 99 def main():
100     obj = OrmTest()
101     obj.add_one()
102     obj.add_all()
103     #obj.update_data()
104     #obj.delete_data()
105     #rest = obj.get_one()
106     #print(f'{rest.id}.{rest.title} => {rest.content}' or 'not exists')
107     print('-'*50)
108     for item in obj.get_more():
109         print(f'{item.id}.{item.title} => {item.content}')
110 
111 
112 if __name__ == '__main__':
113     main()
复制代码

 

posted on   PythonBaby  阅读(47)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示