当前位置: 首页 > 后端技术 > Python

SQLAlchemy使用介绍

时间:2023-03-25 20:01:15 Python

SQLAlchemy是Python语言中流行的ORM(ObjectRelationalMapper)框架。这个框架建立在数据库API之上,使用关系对象映射进行数据库操作,即将对象转换成SQL,然后使用数据API执行SQL,得到执行结果。安装SQLAlchemy也很简单,使用pip安装即可。pipinstallsqlalchemy下面重点介绍SQLAlchemy的使用。版本检查importsqlalchemysqlalchemy.__version__#1.1.9当前sqlalchemy版本为1.1.9连接数据库fromsqlalchemyimportcreate_engineengine=create_engine('mysql+pymysql://root:123456@192.168.110.13:3306/student',echo=True)engine是Engine类的一个对象。echo=True表示启用日志模块的日志数据库连接:engine://user:password@host:port/database,其中engine为mysql+pymysql,或mysql+mysqldb,或oracle+cx_oracle等。从sqlalchemy导入create_engine从sqlalchemy导入列、字符串、整数从sqlalchemy.ext.declarative导入declarative_baseengine=create_engine('mysql+pymysql://root:123456@192.168.110.13:3306/student',echo=True)Base=declarative_base()#生成Model类的基类User1(Base):__tablename__='user1'extend_existing=True#定义三列id=Column(Integer,autoincrement=True,primary_key=True)name=Column(String(64),unique=True,nullable=False)age=Column(Integer)def__repr__(self):return'User(id={},name={},age={})'.format(self.id,self,name,self.age)def__str__(self):returnself.__repr__()Base.metadata.create_all(engine)#创建所有表Base.metadata.drop_all(engine)#删除所有表#定义类的实例方法1u1=User()#User类只接收一个位置参数self,关键字参数**kwargsu1.name='aa'#给每一列赋值theUserclassu1.age=19print(u1)#User(id=None,name=aa,age=19)#定义类的实例方法2u2=User(name='bb',age='123')print(u2)#User(id=None,name=bb,age=123)派生类User会继承基类Base的初始化函数__init__,会自动接受我们定义的列对应的关键字参数。未赋值的列会初始化为None,比如上面idSessionSQLAlchemy中真正和数据库打交道的部分就是Session。如果已经创建了Engine对象engine,则可以通过如下语句创建Sessionfromsqlalchemy.ormimportsessionmakerSession=sessionmaker(bind=engine)如果没有创建engine,可以通过以下语句创建Session=sessionmaker()创建引擎后,可以配置SessionSession.configure(bind=engine)当需要与数据库交互时,需要实例化Sessionsession=Session()创建完成后,session不立即获得数据库连接。只有当session第一次操作数据库时,它才会从Engine维护的连接池中获取一个连接,并持有这个连接,直到我们提交所有的修改或者关闭session。DMLinsertuser=User(name='haha',age='123')session.add(user)session.commit()如果commit过程中出现异常,则后续的commit都无法执行,所以需要放置DML过程在try...except中,如下user=User(name='flowsnow',age=18)session.add(user)try:session.commit()exceptExceptionase:session.rollback()raiseeupdateandInsert类似的,都是使用session.add方法,但是update操作需要在数据库中记录with操作。user.age=20session.add(user)try:session.commit()exceptExceptionase:session.rollback()raiseedelete删除前必须保证数据库中有要删除的记录。session.delete(user)#用户必须已存在User.age.desc())[1:3]:print(u)这条语句经过ORM转换后的SQL如下:SELECTUSER.idASuser_id,USER.NAMEASuser_name,USER.ageASuser_ageFROMUSERWHERE用户。age<%(age_1)sORDERBYUSER.ageDESCLIMIT%(param_1)s,%(param_2)squery函数返回结果为Query对象,可迭代,支持切片操作。下面列出常见的过滤操作equalquery.filter(User.name=='suncle')notequalquery.filter(User.name!='suncle')模糊匹配like:casesensitivequery.filter(User.name.like('%sun%'))模糊匹配ilike:不区分大小写query.filter(User.name.ilike('%sun%'))INquery.filter(User.name.in_(['suncle','abc','suncle']))#还支持查询对象query.filter(User.name.in_(session.query(User.name).filter(User.name.like('%sun%'))))NOTINquery。filter(~User.name.in_(['ed','wendy','jack']))ISNULLquery.filter(User.name==None)#以上写法不符合pep8规范,并且IDE会提示,可以用下面的方法代替,pep8原样写Nonequery.filter(User.name.is_(None))ISNOTNULLquery.filter(User.name!=None)#上面的写法方法不符合pep8规范,IDE会提示,可以用下面的方法代替,pep8写的不是Nonequery.filter(User.name.isnot(None))AND#方法一:使用and_()方法fromsqlalchemyimportand_query.filter(and_(User.name=='flowsnow',User.age==18))#方法二:filter()支持多关键字参数query.filter(User.name=='flowsnow',User.age==18)#方法三:多次调用过滤函数query.filter(User.name=='flowsnow').filter(User.age==18)或从sqlalchemy导入o??r_query.filter(or_(User.name=='suncle',User.name=='flowsnow'))下面列出SQL支持的常用函数fromsqlalchemyimportfuncsession.query(func.count(User.id)).first()#countsession.query(func.max(User.age)).first()#maxsession.query(func.avg(User.age)).first()#之间会有外键关系avgRelationship表与表,数据库的外键关系在ORM中使用如下:fromsqlalchemy.ormBaseimport=relationship_base(生成Model类的基类classAuthor(Base):#Authorclass__tablename__='author'id=Column(Integer,primary_key=True,autoincrement=True)name=Column(String(64),unique=True,nullable=False)posts=relationship('Post')def__repr__(self):return'作者'.format(self.id,self.name)def__str__(self):返回self.__repr__()classPost(Base):#文章类__tablename__='post'id=Column(Integer,primary_key=True,autoincrement=True)title=Column(String(128),nullable=False,index=True)content=Column(String(8096),nullable=False)author_id=Column(Integer,ForeignKey('author.id'),nullable=False)author=relationship('Author')def__repr__(self):return'Post'.format(self.id,self.title)def__str__(self):returnself.__repr__()engine=create_engine('mysql+pymysql://root:123456@192.168.110.13:3306/student',echo=True)Base.metadata.create_all(engine)Session=sessionmaker(bind=engine)session=Session()#新增加一个作者author=Author()author.name='flowsnow'session.add(author)session.commit()print(author)#Author#新增加一篇文章post=Post()post.title='firstpost'post.content='oihdoshfohro'post.author=authorsession.add(post)session.commit()print(author.posts)#[Post]#添加另一篇文章post=Post()post.title='secondpost'post.content='liabhgekegpaerg'post.author=authorsession.add(post)session.commit()print(author.posts)#[Post,Post]数据库维护数据之间的外键关系会消耗数据库资源,影响性能。在大型应用中,一般不使用外键等高级数据库特性,而是由应用框架维护数据之间的约束。参考官方文档-ObjectRelationalTutorialAstep-by-stepSQLAlchemytutorial廖雪峰-使用SQLAlchemy记个赞!对计算机各个方向的视频课程和电子书,从入门、进阶、实用进行了认真梳理,并按照目录进行合理分类。你总能找到你需要的学习资料。你在等什么?立即关注并下载!!!念念不忘,必有回响,朋友们,请点个赞,万分感谢。我是职场亮哥,四年工作经验的YY高级软件工程师,拒绝当领导的斜杠程序员。听我说,我进步很大。如果有幸帮到你,请给我一个【点赞】,给我一个关注,如能评论鼓励,将不胜感激。职场凉阁文章列表:更多文章我的所有文章和回答均与版权保护平台合作,版权归职场凉阁所有。未经授权转载必究!