sqlalchemy基本使用

2017-12-31  本文已影响0人  xin激流勇进

以前创建数据表是这样

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
上一篇下一篇

猜你喜欢

热点阅读