美文网首页
sqlalchemy基本使用

sqlalchemy基本使用

作者: xin激流勇进 | 来源:发表于2017-12-31 19:37 被阅读0次

    以前创建数据表是这样

    CREATE TABLE user (
        id INTEGER NOT NULL AUTO_INCREMENT,
        name VARCHAR(32),
        password VARCHAR(64),
        PRIMARY KEY (id)
    )
    

    用orm实现上面同样的功能,代码如下

    import sqlalchemy
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String
     
    engine = create_engine("mysql+pymysql://root:alex3714@localhost/testdb",
                                        encoding='utf-8', echo=True)
     
     
    Base = declarative_base() #生成orm基类
     
    class User(Base):
        __tablename__ = 'user' #表名
        id = Column(Integer, primary_key=True)
        name = Column(String(32))
        password = Column(String(64))
     
    Base.metadata.create_all(engine) #创建表结构
    

    其实还有另外一种方法,上面的代码就是对其的封装

    from sqlalchemy import Table, MetaData, Column, Integer, String, ForeignKey
    from sqlalchemy.orm import mapper
     
    metadata = MetaData()
     
    user = Table('user', metadata,
                Column('id', Integer, primary_key=True),
                Column('name', String(50)),
                Column('fullname', String(50)),
                Column('password', String(12))
            )
     
    class User(object):
        def __init__(self, name, fullname, password):
            self.name = name
            self.fullname = fullname
            self.password = password
     
    mapper(User, user)
    #the table metadata is created separately
     #with the Table construct,
     #then associated with the User class via the mapper() function
    
    

    from sqlalchemy.orm import sessionmaker
    
    
    Session_class = sessionmaker(bind=engine)
     #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
    Session = Session_class() #生成session实例
     
     
    user_obj = User(name="alex",password="alex3714") 
    user_obj2 = User(name="alex",password="alex3714") 
    #生成你要创建的数据对象
    print(user_obj.name,user_obj.id) 
     #此时还没创建对象呢,不信你打印一下id发现还是None
     
    Session.add(user_obj) 
    Session.add_all([user_obj, user_obj2])
    #把要创建的数据对象添加到这个session里, 一会统一创建
    print(user_obj.name,user_obj.id) #此时也依然还没创建
     
    Session.commit() #现此才统一提交,创建数据
    

    data = Session.query(User).filter(User.id > 1).all()
    print(data)
    # 输出结果 [<__main__.User object at 0x105b4ba90>]
    #只有这样才能查看结果
    print(data[0].name, data[0].password)
    #如果想让它变的可读,只需在定义表的类下面加上这样的代码
    class User(Base):
        __tablename__ = 'user'  # 表名
        id = Column(Integer, primary_key=True)
        name = Column(String(32))
        password = Column(String(64))
    
        def __repr__(self):
            return '<%s name:%s pwd:%s>' % (self.id, self.name, self.password)
    #下面是filter和filter_by的用法
    data = Session.query(User).filter(User.id > 1).filter(User.name == 'alex').first()
    data = Session.query(User).filter(User.id == 1).all()
    data = Session.query(User).filter_by().first()
    data = Session.query(User).filter_by(id=1).all()
    

    #修改一条数据
    data = Session.query(User).filter(User.id > 1).filter(User.name == 'alex').first()
    data.name = 'Merry'
    data.password = 'Merry3306'
    #修改多条数据
    session.query(Users).filter(Users.id > 2).update({"name" : "Merry"})
    Session.commit()
    

    Session.query(Users).filter(Users.id > 2).delete()
    Session.commit()
    

    回滚
    原生sql

    begin; #开始一个事务
     
    insert into user(name,password) values('alex','alex123');
     
    rollback; 回滚 , 这样数据是不会写入的
    

    orm实现

    fake_user = User(name='Rain', password='12345')
    Session.add(fake_user)
    print(Session.query(User).filter(User.name.in_(['Jack','rain'])).all() )
      #这时看session里有你刚添加和修改的数据
     
    Session.rollback() #此时你rollback一下
     
    print(Session.query(User).filter(User.name.in_(['Jack','rain'])).all() )
     #再查就发现刚才添加的数据没有了。
    

    获取所有数据

    print(Session.query(User.name,User.id).all() )
    

    多条件查询

    objs = Session.query(User).filter(User.id>0).filter(User.id<7).all()
    

    统计

    Session.query(User).filter(User.name.like("Ra%")).count()
    

    分组

    from sqlalchemy import func
    print(Session.query(func.count(User.name),User.name).group_by(User.name).all() )
    

    原生sql

    SELECT count(user.name) AS count_1, user.name AS user_name
    FROM user GROUP BY user.name
    

    相关文章

      网友评论

          本文标题:sqlalchemy基本使用

          本文链接:https://www.haomeiwen.com/subject/tcmagxtx.html