最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • python编程学习:怎么连接数据库操作sqlalchemy

    正文概述    2020-09-22   240

    python编程学习:怎么连接数据库操作sqlalchemy

    sqlalchemy是什么呢?其实它就是一个程序,是经常使用的关系程序,应用十分广泛,所以学习好sqlalchemy是非常重要的,结合知识点以及下面示例,很轻松的学会这部分内容。

    1、ORM框架

    常见的ORM框架

    1)SQLAlchemy:SQLAlchemy

    2)SQLObject

    3)Storm

    4)Django's ORM

    2、SQLAlchemy介绍

    sqlalchemy是Python ORM的开源框架,使用它可以快速方便的构建数据库模型。

    SQLALchemy本身无法操作数据库,需要依赖pymysql第三方模块,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作

    使用pymysql连接数据库格式:

    mysql + pymysql: / / <username>:<password>@<host> / <dbname>[?<options>]

    3、安装SQLAlchemy与检查是否安装成功

    #安装
    pip install SQLAlchemy
    #检查是否安装成功
    C:\Users\lsl\Desktop>python
    Python 3.7.0rc1 (v3.7.0rc1:dfad352267, Jun 12 2018, 07:05:25) [MSC v.1914 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sqlalchemy
    >>> sqlalchemy.__version__
    '1.3.18'复制代码

    4、使用SQLAlchemy操作数据库的表——创建对象

    from sqlalchemy import create_engine
    # 连接本地test数据库
    engine = create_engine('mysql+pymysql://root:root@localhost:3306/testdab',#数据库类型是mysql,采用pymysql数据库驱动来连接,用户名是root,密码也是root,连接本地数据库testdab(连接的数据库要是已存在的,就是你本地已有的数据库)
                           encoding='utf-8',  # 编码格式
                           echo=True,  # 是否开启sql执行语句的日志输出
                           pool_recycle=-1,  # 多久之后对线程池中的线程进行一次连接的回收(重置) (默认为-1),其实session并不会被close
                           poolclass=NullPool  # 无限制连接数
                           )复制代码

    5、简单查询——使用SQL语句

    result = engine.execute("select * from students")//在execute()里的参数是查询的sql语句
    print(result.fetchall()) //打印出查询的结果复制代码

    6、创建映射

    创建一个py文件来做数据表的映射text2.py

    #引入要使用的declarative_base
    from sqlalchemy.ext.declarative import declarative_base
    #在要映射的数据表students中有id,name两个字段,所以要引入Integer对应id,String对应name
    from sqlalchemy import Column, Integer, String
    #声名Base
    Base = declarative_base()
    #User类就是对应于 __tablename__ 指向的表,也就是数据表students的映射
    class User(Base):
    #students表是我本地数据库testdab中已存在的
        __tablename__ = 'students'
        id = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(64),nullable=False)
        __table_args__ = {
            "mysql_charset": "utf8"
    }复制代码

    7、查询

    查询students表中所有的数据

    result = mySession.query(News).all()
    print(result[0])复制代码

    查询students表中第一条数据

    result = mySession.query(User).first()
    print(result.name) #打印对象属性复制代码

    通过id查询数据(id=2)

    result = mySession.query(User).filter_by(id=2).first()
    print(result.name)复制代码

    自定义过滤条件

    result = mySession.query(User).filter(text("id>:id")).params(id=2).all()复制代码

    根据主键查询

    result = mySession.query(User).get(2)复制代码

    8、增加数据

    user = User(name="小红")
    mySession.add(user)
    mySession.commit()
    复制代码

    9、删除数据

    mySession.query(User).filter(User.id == 1).delete()
    mySession.commit()复制代码

    10、修改数据

    mySession.query(User).filter(User.name=="小红").update({"name":"小白"})
    mySession.commit()复制代码

    11、常用条件查询代码

    表名:User
     
    1.条件查询
    session.query(User).filter(User.name=='张三'){
                                                   .all()   查询所有
                                                   .one()   查询单个(如果存在多个会异常)
                                                   .first() 查询符合条件的第一个
                                                   .limit(1).one() limit限制查询,limit(1).one()升级第一个
                                                   .count()  查询符合条件的总个数
                                                   }
     
    2.主键查询
    session.query(User).get(0)  查询主键ID=0
     
    3.offset(n) 限制前面n个,显示后面n+1个
    #查询出第三个后面的所有
    session.query(User).offset(3).all()
     
    4.slice()切片
    #slice(1,3) 与python的slice一致,从0开始 左闭右开,显示1,2两个元素
    session.query(User).slice(1,,3).all()
     
    5.order_by() 默认升序
    session.query(User).order_by(User.id).all()
     
    6.desc() 降序
    session.query(User).order_by(desc(User.id)).all()
     
    7.like 模糊匹配,与sql一样
    session.query(User).filter(User.neme.like('%吴')).add()
     
    8.notlike 与7相反
     
     
    form operator import *
     
    9.in_() 包含
    #查询是否包含唐人、吴新喜这个用户的信息
    session.query(User).filter(User.name.in_(['唐人','吴新喜'])).all()
     
     
    10.notin_() 不包含
     
    11.is_  两种表达方式 None
    #查询所有手机号为null的信息
    session.query(User).filter(User.phone==None).all()
    session.query(User).filter(User.phone.is_(None)).all()
     
    12. isnot()
     
    13. or_ 条件或者关系
    #查询name==吴新喜或者唐人的用户信息
    session.query(User).filter(or_(User.name=='唐人',User.name=='吴新喜'))
     
    
    聚合函数
     
    1.count group_by
    #查询所有的密码并且计算其相同的个数
    from sqlalchemy import func
    ssession.query(db_user.psw,func.count(db_user.psw)).group_by(db_user.psw).all()
     
    2.having
    having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。
    而having子句在聚合后对组记录进行筛选。真实表中没有此数据,这些数据是通过一些函数生存。
    即先成组在筛选
     
    #查询所有的密码并且计算其相同的个数,having条件相同密码总数大于1的数据
    ssession.query(db_user.psw,func.count(db_user.psw)).group_by(db_user.psw).having(func.count(db_user.psw)>1).all()
     
    3.sum
    #计算所有id的总和
    ssession.query(func.sum(db_user.id)).all()
     
    4.max
    #最大的ID
     ssession.query(func.max(db_user.id)).all()
     
    5.min
    #最小的id
     ssession.query(func.min(db_user.id)).all()
     
    6.lable 别名
    lable别名不能用在having中
     
    7.extract 提取时间元素
    from sqlalchemy import extract复制代码

    流程总代码:

    #import
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.pool import NullPool
     
    #创建连接对象也就是为了连接到本地的数据库
    engine = create_engine('mysql+pymysql://root:root@localhost:3306/testdab',
                           encoding='utf-8',  # 编码格式
                           echo=True,  # 是否开启sql执行语句的日志输出
                           pool_recycle=-1,  # 多久之后对线程池中的线程进行一次连接的回收(重置) (默认为-1),其实session并不会被close
                           poolclass=NullPool  # 无限制连接数
                           )
    #声名Base
    Base = declarative_base()
     
    # 创建会话
    session = sessionmaker(engine)
    mySession = session()
     
    # 创建类,继承基类,用基本类型描述数据库结构
    class User(Base):
        __tablename__ = 'students'
        id = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(64),nullable=False)
        __table_args__ = {
            "mysql_charset": "utf8"
        }
    #sql语句查询
    result = engine.execute("select * from students")
    print(result.fetchall())
     
    # 查询第一条
    result = mySession.query(User).first()
    print(result.name) #打印对象属性
     
    # 查询所有
    result = mySession.query(User).all()
    print(result[0])
     
    # 查询id为2的
    result = mySession.query(User).filter_by(id=2).first()
    print(result.name)
     
    # 分页查询 0,2
    result = mySession.query(User).filter(User.id>1).limit(2).offset(0).all()
    print(result)
     
    #插入新数据
    user = User(name="小红")
    mySession.add(user)
    mySession.commit()
    result = mySession.query(User).filter_by(name="小红").first()
    print(result.name)
     
     
    #修改已有数据
    mySession.query(User).filter(User.name=="小红").update({"name":"小白"})
    mySession.commit()
    result = mySession.query(User).filter_by(name="小白").first()
    print(result.name)
     
    #删除数据
    mySession.query(User).filter(User.id == 1).delete()
    mySession.commit()
    result = mySession.query(User).first()
    print(result.name) #打印对象属性复制代码

    使用SQLAlchemy ORM操作数据库是最常规的一种方式,以上实例基本上涵盖了操作数据库的所有内容,认真了解看看吧~会有收获很多!

    如需了解更多python实用知识,点击进入起源地模板网教学中心


    起源地下载网 » python编程学习:怎么连接数据库操作sqlalchemy

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元