zoukankan      html  css  js  c++  java
  • sqlAlchemy基本使用

    sqlAlchemy是python中最著名的ORM(Object Relationship Mapping)框架了。

    什么是ORM?

    一句话解释的话就是,一种可以把model中的模型和数据库中的一条数据相互转换的工具。

    初始化数据库连接

    # 初始化数据库链接
    engine = create_engine('mysql+mysqlconnector://root:123456@localhost:3306/test')

    create_engine()函数中的字符串的意义是,数据库+数据库连接框架://用户名:密码@IP地址:端口号/数据库名称。
    那么不难看出,我使用了mysql数据库,数据库连接框架用的mysqlconnector,用户名root,密码123456,ip地址是localhost(会被解析为127.0.0.1),端口号3306(这是mysql服务器默认端口号),test是数据库的名字。

    数据库建表

    在test数据库中,创建user表。sql如下

    create table user (id varchar(20) primary key, name varchar(20))

    创建表,表名为user,表中有两个字段。一个是id,varchar类型,最多支持20个字符,设置为主键,另一个是name,varchar类型,最多支持20个字符。
    ps:主键是唯一的,当你重复插入时会报错,并终止插入操作。

    创建User模型

    在model.py中创建一个User类,用来和User表中的字段进行关联。

    # 定义User对象
    class User(Base):
        # 表的名字
        __tablename__ = 'user'
    
        # 表的结构
        id = Column(String(20), primary_key=True)
        name = Column(String(20))

    这里可以发现,User类的字段名和表中完全一致,而且字段的属性也一样。以id字段为例,表中id的属性是varchar(20),primary key,模型中String(20), primary_key=True。我们可以清晰的看到varchar在程序中对应String,primary_key对应程序中的primary_key属性,而且是个bool类型。
    ps:这里的String是sqlAlchemy中的一个类,这样类似的类我们还会用到Column。

    CRUD(Create Read Update Delete, 增查改删)

    在sqlAlchemy中,增删改查操作是通过一个session对象(DBSession,是由sessionmaker创建的)来完成的。如果你和我一样是新手,估计也完全不懂,但是至少读一遍有个印象,我们一步一步来。
    所以,我们需要创建session。

    # 创建DBSession类型
    DBSession = sessionmaker(bind=engine)

    在此基础之上我们就能进行增删改查的操作了。先从增加开始。

    # 创建Session对象
    session = DBSession()
    # 创建User对象
    new_user = User(id='1', name='Bob')
    # 添加到session
    session.add(new_user)
    # 提交
    session.commit()
    # 关闭session
    session.close()

    还有查询

    # 创建session
    session = DBSession()
    # 利用session创建查询,query(对象类).filter(条件).one()/all()
    user = session.query(User).filter(User.id=='1').one()
    print('type:{0}'.format(type(user)))
    print('name:{0}'.format(user.name))
    # 关闭session
    session.close()

    更新操作
    要多一步,就是要先根据筛选条件拿到要更改的对象,然后给对象赋值,再次提交(commit)即可。

    # 更新
    session = DBSession()
    user_result = session.query(User).filter_by(id='1').first()
    user_result.name = "jack"
    session.commit()
    session.close()

    删除操作

    # 删除
    session = DBSession()
    user_willdel = session.query(User).filter_by(id='5').first()
    session.delete(user_willdel)
    session.commit()
    session.close()

    代码整合

    把上面零零散散的代码片段合起来

    # 导入依赖
    from sqlalchemy import Column, String, create_engine
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.ext.declarative import declarative_base
    
    # 创建对象的基类
    Base = declarative_base()
    
    # 定义User对象
    class User(Base):
        # 表的名字
        __tablename__ = 'user'
    
        # 表的结构
        id = Column(String(20), primary_key=True)
        name = Column(String(20))
    
    
    # 初始化数据库链接
    engine = create_engine('mysql+mysqlconnector://root:123456@localhost:3306/test')
    
    # 创建DBSession类型
    DBSession = sessionmaker(bind=engine)
    
    
    # 添加
    # 创建Session对象
    session = DBSession()
    # 创建User对象
    new_user = User(id='5', name='Bob')
    # 添加到session
    session.add(new_user)
    # 提交
    session.commit()
    # 关闭session
    session.close()
    
    
    # 查询
    # 创建session
    session = DBSession()
    # 利用session创建查询,query(对象类).filter(条件).one()/all()
    user = session.query(User).filter(User.id=='5').one()
    print('type:{0}'.format(type(user)))
    print('name:{0}'.format(user.name))
    # 关闭session
    session.close()
    
    
    # 更新
    session = DBSession()
    user_result = session.query(User).filter_by(id='1').first()
    user_result.name = "jack"
    session.commit()
    session.close()
    
    
    # 删除
    session = DBSession()
    user_willdel = session.query(User).filter_by(id='5').first()
    session.delete(user4._willdel)
    session.commit()
    session.close()

    如果运行代码发现报错了,你也许是因为以下几个原因:

    • 1.test数据库中没有User表
    • 2.检查数据库连接语句中,create_engine中的字符串是否正确
    • 3.表中数据重复,如果你像我一样设置了主键的话,是不能重复插入数据的,所以程序会报错

    • 4.model.py中的User描述的表结构与test数据库User表定义的结构是否一致
      暂时只想到这几个原因,具体原因还要运行窗口中的报错信息。


      image.png

    以上内容参考廖雪峰老师的博客,传送门
    还有一个哥们的博客的查询操作写的很详细,也可以看一下,传送门

    到此为止,也只能是了解了sqlAlchemy的基本操作,下一章再深入一些了解,传送门


    作者:转身丶即天涯
    链接:https://www.jianshu.com/p/20593da77c04
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
     
    另外这篇博客对sqlalchemy的session的描述很生动好理解的
    https://www.cnblogs.com/mrchige/p/6389588.html
     
  • 相关阅读:
    trim标签:可以自定义字符串的截取规则
    登录框(用获取value值方法)
    C++在ARM Linux下的交叉编译
    happybase导入报错:thriftpy.parser.exc.ThriftParserError: ThriftPy does not support generating module with path in protocol 'c'
    Nginx报错总结
    ubuntu安装Nginx
    mqtt在debian strench 9 docker环境下的搭建
    evokly/kafka-connect-mqtt 不支持kafka集群部署
    树莓派mqtt安装
    kafka和mqtt的区别和联系
  • 原文地址:https://www.cnblogs.com/kaerxifa/p/11050471.html
Copyright © 2011-2022 走看看