面向对象的一些特殊方法:一定要记住的方法....就四个方法
class Foo: def __init__(self, name): self.name = name def show(self): print(self.name) #实例化出来的对象加()就会运行call函数 def __call__(self): pass def __getitem__(self, key): pass def __setitem__(self, key, value): pass def __delitem__(self, key): pass obj1 = Foo('eric') obj1() obj1['k'] obj1['k'] = 123 del obj[k] obj.__dict__
SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
实现对数据库的操作,如:
MySQL-Python mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname> pymysql mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>] MySQL-Connector mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname> cx_Oracle oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html
一、ORM的功能使用
1.创建表
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy import create_engine Base = declarative_base()#固定的生成一个基类 #在创建之前,需要先调用sqlalchemy模块,以及该模块中的属性, class UserType(Base): __tablename__ = 'usertype' id = Column(Integer,primary_key=True,autoincrement=True) title = Column(String(32),nullable=True,index=True) class Users(Base):#每一个类就代表着一个表 __tablename__ = 'uses' #建立表名 #和原生的大致是一样的,里面创建的一些方式都是一样。 # __tablename__:设置表名称 # Integer:整数类型 # primary_key=True:主键 # autoincrement=True:自增id # nullable=True:是否为空 # index=True:索引 # unique=True:唯一约束 # ForeignKey:建立外键,绑定到你对应的表的id # relationship:通过建立的外键,建立关系, -- 正向操作:即运行users中的user_type,可以调取到外键的表内容 -- 方向操作:即运行UserType,即可以运行主表的内容 id = Column(Integer,primary_key = True,autoincrement=True) name = Column(String(32),nullable=True,index=True) email = Column(String(16),unique=True) user_type_id = Column(Integer,ForeignKey('usertype.id')) # __table_args__:创建 __table_args__ = ( #建立唯一联合索引,有约束的关系,即列与列之间是相同的有关系 UniqueConstraint('id','name',name = 'ux_id_name'), #建立普通联合索引,没有约束,即列与列之间是相同的也没关系 Index('ix_n_name','name','email') ) #建立数据库连接 ''' mysql+pymysql:数据库+通过python中的pymysql进行连接 root:数据库的账号 1234qwer:数据库的账号密码 127.0.0.1:ip地址 3306:端口号 db1:数据库名称 charset=utf8:编码 max_overflow=5:最大连接数, ''' # create_engine用来初始化数据库连接 engine = create_engine('mysql+pymysql://root:1234qwer@127.0.0.1:3306/db1?charset=utf8',max_overflow=5) #根据我创建的表提交到数据库中,创建完之后可以注释掉,以免重复创建。 Base.metadata.create_all(engine)
2.增加
#创建Session类型 Session = sessionmaker(bind=engine) #创建session对象 session = Session() #实例化一个对象 obj1=UserType(title='普通用户') #通过add添加到表中 session.add(obj1) #创建多个用户, objs=[ UserType(title='普通用户'), UserType(title='高级用户'), UserType(title='黑金用户'), ] #使用add_all,增加多个,进行添加 session.add_all(objs) session.commit() #提交你对表的操作 session.close() #关闭表
3.查找
#创建Session类型 Session = sessionmaker(bind=engine) #创建session对象 session = Session() #得到的是一个sql查询的语句 #session.query():session是一个对象,query()是一个方法 print(session.query(UserType)) #all()取出所有的内容 user_type_list = session.query(UserType).all() #user_type_list,获取的是一个迭代器,需要通过遍历取出里面的内容 for row in user_type_list: print(row.id,row.title) #根据筛选进行查找filter(UserType.id>2)=where UserType.id>2 user_type_list = session.query(UserType.id,UserType.title).filter(UserType.id>2) for row in user_type_list: print(row.id,row.title)
4.删除
#创建Session类型 Session = sessionmaker(bind=engine) #创建session对象,可以看做是连接当前的数据库 session = Session() #通过filter过滤出来,然后直接使用delete方法删除你过滤出来的 session.query(UserType.id,UserType.title).filter(UserType.id>5).delete() session.commit() #提交你对表的操作 session.close() #关闭表
5.修改
#通过不同的类型,添加不同的值 ''' update:修改,方法中一定要用字典的形式 synchronize_session=False:字符串相加 synchronize_session='evaluate':整数相加 ''' session.query(UserType.id,UserType.title).filter(UserType.id >2).update({'title':'钻石'}) session.query(UserType.id,UserType.title).filter(UserType.id >2).update({UserType.title:UserType.title+'y'},synchronize_session=False)#字符串相加 session.query(UserType.id,UserType.title).filter(UserType.id >2).update({UserType.num:UserType.num+1},synchronize_session='evaluate') # 整数相加
问题集:
正向操作:即运行users中的user_type,可以调取到外键的表内容
反向操作:即运行UserType,即可以运行主表的内容
问题1.获取用户信息以及与其关联用户类型名称(FK,relationship=>正向操作)以下是不同的思路
#isouter=True:左连接,默认是inner,join:sql中的连表 user_list = session.query(Users,UserType).join(UserType,isouter=True) # # print(user_list)#结果是一个连表的操作 for row in user_list: print(row[0].id,row[0].name,row[0].email,row[0].user_type_id,row[1].title)
#all():返回所有行,one():返回一行,不加参数是返回所有行 userlist = session.query(Users.name,UserType.title).join(UserType,isouter=True).all() #在查询的时候查询的是Users.name,UserType.title,既可以通过索引查找,也可以通过固定的列名 for row in userlist: print(row[0],row[1],row.name,row.title)
正向操作:即运行users中的user_type,可以调取到外键的表内容
#上面的两个方法,都是需要进行连表,这个是通过在Users类中添加了,对外键的表建立的关联。 # user_type = relationship('UserType',backref='xxoo'),所以就可以直接查询Users表,就能读取外键表的内容 user_list = session.query(Users) for row in user_list: print(row.name,row.id,row.user_type.title)
问题2.获取用户类型
#反向操作:即运行UserType,即可以运行主表的内容 type_list = session.query(UserType) for row in type_list: #通过外键的表反查询主表的内容,可以通过反向操作,查询不同的用户的人数.... print(row.id,row.title,session.query(Users).filter(Users.user_type_id==row.id).all())
#反向操作:即运行UserType,即可以运行主表的内容,user_type = relationship('UserType',backref='xxoo'), #backref='xxoo',代表着行。通过遍历,就能取到主表的数据 #查看的是的外键的表,row.xxoo获取的是外键的用户,是一个对象,组成的列表,可以通过遍历,显示列表中的用户 type_list = session.query(UserType) for row in type_list: #通过反向操作, print(row.id,row.title,[i.name for i in row.xxoo])