zoukankan      html  css  js  c++  java
  • 9、ORM框架------SQLAlchemy(1)

    ORM:对象关系映射

    SQLAlchemy是code  first

    而django中的orm既有code  first(先有类),又有db  first(先有数据库及表)

    安装:

    sudo apt install python3-pip
    pip3 install sqlalchemy    #只负责将类及对象转换为sql语句
    pip3 install pymysql    #负责连接mysql并执行sql语句,其它还有mysqldb

    创建数据库表:

    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column,Index,Integer,UniqueConstraint,String,ForeignKey
    
    engine = create_engine("mysql+pymysql://root:w@127.0.0.1:3306/study?charset=utf8",echo=True,max_overflow=5)
    #engine用于设置连接,echo在进行数据库表操作时,是否显示过程,可以不写;max_overflow最大连接数,不写默认是5。注意编码的写法! Base
    = declarative_base()
    #生成orm基类,之后的类都要继承它
    class UserType(Base): __tablename__ = 'usertype'    #表名,小写 id = Column(Integer,primary_key=True,autoincrement=True) title = Column(String(50)) class Users(Base): __tablename__ = 'users' id = Column(Integer,primary_key=True,autoincrement=True) name = Column(String(32),nullable=True,default='lyb',unique=True) email = Column(String(16),index=True) user_type_id = Column(Integer,ForeignKey('usertype.id')) __table_args__ = ( UniqueConstraint('name','email',name='uix_name_email'),  #组合索引 ) Base.metadata.create_all(engine)
    #创建表,此时运行脚本,在数据库中会创建继承了Base的表。另外再次运行时不会重复创建,也不会报错
    # Base.metadata.drop_all(engine)
    删除表

    数据的增删改查: 在query.py模块中

    创建会话:

    from sqlalchemy.orm import sessionmaker
    
    Session = sessionmaker(bind=engine)
    # 绑定连接引擎,创建会话类,注意返回的类,不是实例
    sess = Session()
    # 此时才生成会话实例

    增:

    obj1 = UserType(title='普通用户1')
    obj2 = UserType(title='白金用户2')
    obj3 = UserType(title='超级用户3')
    # 创建数据对象,对象 == 数据行,类 == 表
    sess.add_all([obj1,obj2,obj3])
    # 将数据添加到会话,一次多个,也可以一次一个用add(obj1)
    
    sess.commit()
    # 统一提交并创建数据

    另一种增法:还可以把下面的合并为一个迭代

    type = ['普通','白金','黑金','超级']
    for item in type:
        sess.add(UserType(title=item))
    
    user = [('qqq',2),('eee',1),('ddd',2),('rrr',4)]
    for item in user:
        sess.add(User(name=item[0],usertype_id=item[1]))
    sess.commit()

    查:

    # q_list1 = sess.query(UserType).all()
    # for row in q_list1:
    #     print(row.id,row.title)
    
    q_list2 = sess.query(UserType).filter(UserType.id!=2)
    # >, >=, <, <=,==,!=
    for row in q_list2:
        print(row.id,row.title)

    #或,直接用关键字
    q_list2 = sess.query(UserType).filter_by(id=2,title='普通用户')

    直接查询:

    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker
    
    engine = create_engine('mysql+pymysql://root:w@127.0.0.1:3306/lx?charset=utf8')
    Session = sessionmaker(bind=engine)
    sess = Session()
    res = sess.execute('select NAME ,type from USER LEFT JOIN usertype ON typeid=tid')
    for i in res:
        print(i[0],i[1])
    qqq 普通
    lll 白银
    rew 白银
    yue 黑金
    cvb 超级

    删:注意需要提交

    sess.query(UserType.id,UserType.title).filter(UserType.id<=2).delete()
    sess.commit()

    改:

    #满足条件的title全改为‘用户’
    sess.query(UserType.id,UserType.title).filter(UserType.id>=5).update({'title':'用户'}) sess.commit()
    #满足添加的title的值后全部加上‘x’。字符串情况
    sess.query(UserType.id,UserType.title).filter(UserType.id>=5).update({UserType.title: UserType.title + 'x'}, synchronize_session=False) sess.commit()
    #数字情况
    sess.query(UserType.id,UserType.title).filter(UserType.id>=5).update({UserType.title: UserType.title - 2}, synchronize_session='evaluate') sess.commit()
    渐变 --> 突变
  • 相关阅读:
    Angular语法(三)——数据绑定
    Angular语法(二)——模板语法
    Angular语法(一)——展示数据
    Angular常用指令
    windows下启动redis
    WPF实现弹幕
    微信获得用户信息
    拉普拉斯变换
    Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering
    Python之并行
  • 原文地址:https://www.cnblogs.com/lybpy/p/8046670.html
Copyright © 2011-2022 走看看