zoukankan      html  css  js  c++  java
  • (转)python之sqlalchemy详解

    原文:https://zhuanlan.zhihu.com/p/71134861

    ps = session.query(Person).first()
    print(ps)
    # 3、修改制定行数据
    person = session.query(Person).first()
    print(person)
    # 修改表数据,对象.属性 = '   '
    person.name = 'hahaha'
    # 别忘记要提交哦~
    session.commit()
    # 4、删除表数据
    person = session.query(Person).get(3)
    print(person)
    session.delete(person)
    session.commit()

    Column常用数据类型

    常用的数据类型,一共是有11个。

    注:在SQLAlchemy中不存在double数据类型,使用DECIMAL类型替代

    让我们来分别看下这11个数据类型都有哪些?

    1. Integer:整型,映射到数据库中是int类型。
    2. Float:浮点类型,映射到数据库中是float类型。他占据的32位。
      浮点类型,有可能会造成精度丢失,特别是在money方面,不可原谅。
    3. Double(SQLAlchemy中没有,代替品为DECIMAL):双精度浮点类型,映射到数据库中是double类型,占据64位
    4. String:可变字符类型,映射到数据库中是varchar类型.
    5. Boolean:布尔类型,映射到数据库中的是tinyint类型。
    6. DECIMAL:定点类型。是专门为了解决浮点类型精度丢失的问题的。在存储money相关的字段的时候建议大家都使用这个数据类型。并且这个类型使用的时候需要传递两个参数,第一个参数是用来标记这个字段总能能存储多少个数字,第二个参数表示小数点后有多少位。
    7. Enum:枚举类型。指定某个字段只能是枚举中指定的几个值,不能为其他值。在ORM模型中,使用Enum来作为枚举。
    8. Date:存储时间,只能存储年月日。映射到数据库中是date类型。在Python代码中,可以使用datetime.date来指定。
    9. DateTime:存储时间,可以存储年月日时分秒毫秒等。映射到数据库中也是datetime类型。在Python代码中,可以使用datetime.datetime来指定。
    10. Time:存储时间,可以存储时分秒。映射到数据库中也是time类型。在Python代码中,可以使用datetime.time来指定
      ps:注意区分Date/DateTime/Time的储存信息!!!
    11. Text:存储长字符串。一般可以存储6W多个字符
    12. LONGTEXT:长文本类型,映射到数据库中是longtext类型(不过这个只有mysql有,orcale没有)

    上述就是11个数据类型,因为这里把不存在的double也添加上了,所以看起来是12个。

    下面就让咱们一起来进行验证。

    代码实现

    # 依次导入常用的数据类型
    from sqlalchemy import create_engine, Column, Integer, String,Float,DECIMAL,Boolean,Date,DateTime,Time,Text,Enum
    # 从sqlalchemy的方言模块dialects导入mysql专有的LONGTEXT,长文本类型
    from sqlalchemy.dialects.mysql import LONGTEXT
    # 在python3.x中有enum模块
    import enum
    #导入时间了
    from datetime import datetime,date,time
    # 用`declarative_base`根据`engine`创建一个ORM基类。
    from sqlalchemy.ext.declarative import declarative_base
    # 引入创建py和数据库连接的sessionmaker函数
    from sqlalchemy.orm import sessionmaker
    # 准备连接数据库基本信息
    HOSTNAME = '127.0.0.1'
    PORT = '3306'
    DATABASE = 'first_sqlalchemy'
    USERNAME = 'root'
    PASSWORD = 'root'
    DB_URI = 'mysql+pymysql://{username}:{pwd}@{host}:{port}/{db}?charset=utf8' \
        .format(username=USERNAME, pwd=PASSWORD, host=HOSTNAME, port=PORT, db=DATABASE)
    # 创建数据库引擎
    engine = create_engine(DB_URI)
    Base = declarative_base(engine)
    # 需求:常用的数据类型
    # 枚举另外一种写法,导入enum模块,定义枚举类
    class TagEnum(enum.Enum):
        python = "PYTHON"
        flask = 'FLASK'
        django = 'DJANGO'
    class News(Base):
        __tablename__ = 'news'
        id = Column(Integer,primary_key=True,autoincrement=True)
        price1 = Column(Float)   # 不过存储数据时存在精度丢失的问题
        price2 = Column(DECIMAL(10,4))
        title = Column(String(50))
        is_delete = Column(Boolean)
        tag1 = Column(Enum('PYTHON','FLASK','DJANGO'))  # 枚举的常规写法(推荐)
        tag2 = Column(Enum(TagEnum))  # 另一种写法
        create_time1 = Column(Date)
        create_time2 = Column(DateTime)
        create_time3 = Column(Time)
        content1 = Column(Text)
        content2 = Column(LONGTEXT)
    # 将Base上的ORM类模型对应的数据表都删除
    # Base.metadata.drop_all()
    # 创建Base上的ORM类到数据库中成为表
    # Base.metadata.create_all()
    # 新增数据到表news中
    session = sessionmaker(engine)()
    # 注意float出现的精度丢失问题      is_delete,布尔类型true:1,false:0
    news1 = News(price1=1000.0078,price2=1000.0078,title='测试数据',is_delete=True,tag1="PYTHON",tag2=TagEnum.flask,    create_time1=date(2018,12,12),create_time2=datetime(2019,2,20,12,12,30),create_time3=time(hour=11,minute=12,second=13),content1="hello",content2 ="hello   hi   nihao")
    session.add(news1)
    session.commit()

    Column常用约束参数

    在给数据库表指定key的时候,必然要给它们添加,例如:不可空,字节长度等等的限制,这就需要约束参数的出场了。常用的约束参数一共有7种

    常见约束参数

    约束参数描述,功能primary_keyTrue设置某个字段为主键autoincrementTrue设置这个字段为自动增长的default设置某个字段的默认值。在发表时间这些字段上面经常用nullable指定某个字段是否为空。默认值是True,就是可以为空unique指定某个字段的值是否唯一。默认是False。onupdate在数据更新的时候会调用这个参数指定的值或者函数。在第一次插入这条数据的时候,不会用onupdate的值,只会使用default的值。常用于是update_time字段(每次更新数据的时候都要更新该字段值)。name指定ORM模型中某个属性映射到表中的字段名。如果不指定,那么会使用这个属性的名字来作为字段名。这个参数也可以当作位置参数,在第1个参数来指定。

    代码实现

    # 注意千万不能忘记要先创建session对象啊!!
    # 需求:sqlalchemy中Column常用的约束参数
    class News(Base):
        __tablename__ = 'news'
        id = Column(Integer,primary_key=True,autoincrement=True)
        # 这个Datetime是sqlalchemy中的
        create_time = Column(DateTime,default=datetime.now)
        read_count = Column(Integer,default=11)
        title1 = Column(String(50),name='my_title',nullable=False)
        title2 = Column('my_title22',String(50), nullable=False)# name 属性的两种方式
        telephone = Column(String(11),unique=True)
        update_time = Column(DateTime,onupdate=datetime.now,default=datetime.now)#onupdate是在数据更新的时候才会起作用,插入数据时候不起作用
    # Base.metadata.drop_all()
    # Base.metadata.create_all()
    news1 = News(title1 ='hahah',title2 = 'womingsad')
    session.add(news1)
    #结束之后,必须要提交
    session.commit()

    Query查询函数,可以传递的参数有哪些?

    Query查询函数传递的参数无非就是分为三类,分别是模型名、模型中的属性、聚合函数,那下面就简单的说明,

    模型名

    指定查找该模型中所有属性(对应查询为全表查询)

    模型中的属性

    可以指定只查找某个模型的其中几个属性

    聚合函数

    聚合函数一共有五个,都被放到了sqlalchemy的func模块中。
    1. func.count:统计行的数量
    2. func.avg:求平均值
    3. func.max:求最大值
    4. func.min:求最小值
    5. func.sum:求和

    代码实现

    # 新增测试数据
    for x in range(1,6):
    a = News(title = "标题%s"%x,price = random.randint(1,100))
    session.add(a)
    # 提交
    session.commit()
    # 三种参数
    # 模型名
    result = session.query(News).all()  #全表查询
    print(result)
    # 模型名的属性名,返回的列表中的元素是元组类型数据
    result = session.query(News.title,News.price).all()
    print(result)
    # 聚合函数
    # 统计行的数量
    r = session.query(func.count(News.id)).first()
    print(r)
    #最大值
    r = session.query(func.max(News.price)).first()
    print(r)
    #最小值
    r = session.query(func.min(News.price)).first()
    print(r)
    #平均值
    r = session.query(func.avg(News.price)).first()
    print(r)
    #求和
    r = session.query(func.sum(News.price)).first()
    print(r)
  • 相关阅读:
    Windows Server 2008 R2 免费使用 7200天 激活
    ceph部署步骤
    for循环间隔修改(解决把以空格隔开需要把一整行作为整体)
    my_learn
    fiddler-抓包
    基础软件搭建
    【原创】一层Nginx反向代理K8S化部署实践
    【原创】K8S使用ceph-csi持久化存储之CephFS
    【原创】K8S使用ceph-csi持久化存储之RBD
    [原创]自动化部署K8S(v1.10.11)集群
  • 原文地址:https://www.cnblogs.com/liujiacai/p/15417265.html
Copyright © 2011-2022 走看看