首页 > 技术文章 > python之sqlalchemy模块

yangxiang1 2017-06-13 19:22 原文

面向对象的一些特殊方法:一定要记住的方法....就四个方法

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])

 

 

推荐阅读