使用sqlalchemy

 1 from sqlalchemy import create_engine
 2 from sqlalchemy.ext.declarative import declarative_base
 3 from sqlalchemy import Column,Integer,String,CHAR,and_,or_,ForeignKey,UniqueConstraint,Index
 4 from  sqlalchemy.orm import sessionmaker,relationship
 5 
 6 engine = create_engine('mysql+pymysql://root@127.0.0.1:3306/ces?charset=utf8') #连接数据库
 7 Base = declarative_base()#生成一个SQLORM基类
 8 
 9 class User(Base):
10      __tablename__ = 'users'
11      id = Column(Integer,primary_key=True,autoincrement=True)
12      name = Column(String(32))
13      fullname = Column(String(32))
14      password = Column(CHAR(32))
15     extra = Column(String(16))
16     
17      __table_args__ = (
18          UniqueConstraint('id', 'name', name='uix_id_name'),
19          Index('ix_id_name', 'name', 'extra'),
20      )
21 
22     def __repr__(self):
23          return "<User(name='%s',fullname='%s',password='%s')>%(self.name,self.fullname,self.passwpord)"

一对多

 1 class Favor(Base):
 2     __tablename__ = 'favor'
 3     nid = Column(Integer,primary_key=True,autoincrement=True)
 4     caption = Column(String(50),default="red",unique=True)
 5 
 6 class Person(Base):
 7     __tablename__ = 'person'
 8     nid = Column(Integer,primary_key=True,autoincrement=True)
 9     name = Column(String(50),index=True,nullable=True)
10     favor_id = Column(Integer,ForeignKey('favor.nid'))

多对多

 1 class Group(Base):
 2     __tablename__ = 'group'
 3     id = Column(Integer,primary_key=True)
 4     name = Column(String(64),unique=True,nullable=False)
 5     port = Column(Integer,default=22)
 6 
 7 class Server(Base):
 8     __tablename__ = 'server'
 9     id = Column(Integer,primary_key=True,autoincrement=True)
10     hostname = Column(String(64),unique=True,nullable=False)
11 
12 class ServerToGroup(Base):
13     __tablename__ = 'servertogroup'
14     nid = Column(Integer,primary_key=True,autoincrement=True)
15     server_id = Column(Integer,ForeignKey('server.id'))
16     group_id = Column(Integer,ForeignKey('group.id'))
17 class Son(Base):
18     __tablename__ = 'son'
19     id = Column(Integer,primary_key=True,autoincrement=True)
20     name = Column(String(50))
21     age = Column(String(16))
22     father_id = Column(Integer,ForeignKey('father.id'))
23 
24 class Father(Base):
25     __tablename__ = 'father'
26     id = Column(Integer,primary_key=True,autoincrement=True)
27     name = Column(String(50))
28     age = Column(String(12))
29     son = relationship('Son',backref="father")

添加数据

 1 Base.metadata.create_all(engine) #创建所有表结构
 2 MySession = sessionmaker(bind=engine)
 3 session = MySession()
 4 ed_user = User(name="xiaoyu",fullname="Xiaoyu Lu",password="123")
 5 session.add(ed_user ) 添加一条数据
 6 session.commit()
 7 
 8 session.add_all([
 9      User(name="张三",fullname="3",password="456"),
10      User(name="王五",fullname="5",password="789"),
11      User(name="马六",fullname="6",password="sxsxsx")
12 ])#添加多条数据
13 
14 session.commit()
15 
16 session.close()

删除数据

 1 session.query(Users).filter(Users.id > 2).delete() 

修改数据

1 #把ID大于2的名字都改为099
2 session.query(Users).filter(Users.id > 2).update({"name" : "099"})
3 #把ID大于2的名字,在原有的名字基础上加099
4 session.query(Users).filter(Users.id > 2).update({Users.name: Users.name + "099"}, synchronize_session=False)
5 #把ID大于2的数值都加1
6 session.query(Users).filter(Users.id > 2).update({"num": Users.num + 1}, synchronize_session="evaluate")
7 session.commit()

查询数据

#排序,从小到大读取数据
for row in session.query(User).order_by(User.id):
     print(row)
#按条件查询查询(查询数据库中在列表里面是否有相同的内容,如果有就打印,没有则不打印)
for row in session.query(User).filter(User.name.in_(['wangwu','zhansgan','jack'])):
     print(row)
#按条件查询查询,与上面的刚好相反,如果存在不打印,不存在打印
 for row in session.query(User).filter(~User.name.in_(['wangwu','zhansgan','jack'])):
     print(row)
#统计有多少条内
session.query(User).filter(User.name == 'wangwu').count()
session.query(User).filter_by(id=1).count()
#读取多条
ret = session.query(Users).filter_by(name='wangwu').all()
#读取一条 ret = session.query(Users).filter_by(name='wangwu').first()
ret = session.query(Users).filter(text("id<:value and name=:name")).params(value=224, name='fred').order_by(User.id).all()

ret = session.query(Users).from_statement(text("SELECT * FROM users where name=:name")).params(name='ed').all()

其他

# 条件
ret = session.query(Users).filter_by(name='alex').all()
ret = session.query(Users).filter(Users.id > 1, Users.name == 'eric').all()
ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all()
ret = session.query(Users).filter(Users.id.in_([1,3,4])).all()
ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all()
ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all()
from sqlalchemy import and_, or_
ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all()
ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all()
ret = session.query(Users).filter(
    or_(
        Users.id < 2,
        and_(Users.name == 'eric', Users.id > 3),
        Users.extra != ""
    )).all()


# 通配符
ret = session.query(Users).filter(Users.name.like('e%')).all()
ret = session.query(Users).filter(~Users.name.like('e%')).all()

# 限制
ret = session.query(Users)[1:2]

# 排序
ret = session.query(Users).order_by(Users.name.desc()).all()
ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()

# 分组
from sqlalchemy.sql import func

ret = session.query(Users).group_by(Users.extra).all()
ret = session.query(
    func.max(Users.id),
    func.sum(Users.id),
    func.min(Users.id)).group_by(Users.name).all()

ret = session.query(
    func.max(Users.id),
    func.sum(Users.id),
    func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all()

# 连表

ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()

ret = session.query(Person).join(Favor).all()

ret = session.query(Person).join(Favor, isouter=True).all()


# 组合
q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union(q2).all()

q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union_all(q2).all()

 

posted on 2017-12-10 12:01  LOVESTYUDY  阅读(167)  评论(0编辑  收藏  举报

导航