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'作者
