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)
  • 相关阅读:
    Win10 UWP Tile Generator
    Win10 BackgroundTask
    UWP Tiles
    UWP Ad
    Win10 build package error collections
    Win10 八步打通 Nuget 发布打包
    Win10 UI入门 pivot multiable DataTemplate
    Win10 UI入门 导航滑动条 求UWP工作
    UWP Control Toolkit Collections 求UWP工作
    Win10 UI入门 SliderRectangle
  • 原文地址:https://www.cnblogs.com/liujiacai/p/15417265.html
Copyright © 2011-2022 走看看