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 2021-10-30 12:37 PythonBaby 阅读(47) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗