python4 sqlalchemy模块学习
首先我们学习如何创建一个表!
import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.orm import sessionmaker
#创建一个实例,mysql+pysql 是说sqlalchemy利用Pymysql底层支持 engine = create_engine("mysql+pymysql://root:123456@localhost/mysql", encoding='utf-8', echo=True) Base = declarative_base() #生成orm基类 #创建user类的时候继承该基类,column我就是帮你自动转换成mysql的格式 class User(Base): __tablename__ = 'user4' #表名 id = Column(Integer, primary_key=True) name = Column(String(32)) password = Column(String(64)) Base.metadata.create_all(engine) #创建表结构 #这样我们就完成了在mysql下创建了 id 为主键 ,name,password 的名为 User4的表
Session_class = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例 Session = Session_class() #生成session实例 user_obj = User(name="alex",password="alex3714") #生成你要创建的数据对象 print(user_obj.name,user_obj.id) #此时还没创建对象呢,不信你打印一下id发现还是None Session.add(user_obj) #把要创建的数据对象添加到这个session里, 一会统一创建 print(user_obj.name,user_obj.id) #此时也依然还没创建 Session.commit() #现此才统一提交,创建数据 #综合起来就是 创一个表结构后 往里面输入数据 放在第一写法中!!!!!!
echo=True 会显示大量的结果,如果我们去掉的话那么则不print大量的数据在面板上了!
查询我们会发现创建成功!
另外一种创建方式,不过不常用!
from sqlalchemy import Table, MetaData, Column, Integer, String, ForeignKey from sqlalchemy.orm import mapper #相当于创建一个实例,开始创建 metadata = MetaData() #利用Table,传入metadata,之后利用 Column 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) #二者联系在一起创建一个表!!!
事实上,我们用第一种方式创建的表就是基于第2种方式的再封装。
2.创建完之后我进行学习增删改查!
查询:
#查询在User表中 name=a 的返回
my_user = Session.query(User).filter_by(name="a").first() print(my_user)
我们获得结果是这样的:<__main__.User
object
at
0x105b4ba90
> 这是一个对象 我们如何能清楚的看见内容呢?在上面第一段代码中我们创建的类里面添加一个这样的函数我们就会格式化的输出 他的名字 以及 密码
def __repr__(self): return "<User(name='%s', password='%s')>" % ( self.name, self.password)
查询所有的数据
print
(Session.query(User.name,User.
id
).
all
() ) #查以一个数据我们用的是first
多条件查询
objs
=
Session.query(User).
filter
(User.
id
>
0
).
filter
(User.
id
<
7
).
all
() #查询所有大于0小于7的数据并返回给objs
objs
=
Session.query(User).
filter_by(id=number).
all
() #查询等于数字Number的数据并返回给objs
修改
my_user = Session.query(User).filter_by(name="alex").first() my_user.name = "Alex Li" Session.commit()
回滚:
my_user = Session.query(User).filter_by(id=1).first() my_user.name = "Jack" 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() ) #再查就发现刚才添加的数据没有了。 # Session # Session.commit()
统计:
#统计一Ra开头的所有数据!返回其数量!
Session.query(User).filter(User.name.like("Ra%")).count()
分组:
统计name的数量分组并打印!
from sqlalchemy import func print(Session.query(func.count(User.name),User.name).group_by(User.name).all() )
外键关联:
import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String from sqlalchemy import ForeignKey from sqlalchemy.orm import relationship from sqlalchemy.orm import sessionmaker #创建一个实例,mysql+pysql 是说sqlalchemy利用Pymysql底层支持 engine = create_engine("mysql+pymysql://root:123456@localhost/mysql", encoding='utf-8') Base = declarative_base() #生成orm基类 #创建user类的时候继承该基类,column我就是帮你自动转换成mysql的格式 class Student(Base): __tablename__ = 'student' #表名 id = Column(Integer, primary_key=True) name = Column(String(32),nullable=False) def __repr__(self): return "<%s name : %s>"%(self.id,self.name) class Student_record(Base): __tablename__ = 'student_record' #表名 id = Column(Integer, primary_key=True) day=Column(Integer,nullable=False) status=Column(String(32),nullable=False) stu_id=Column(Integer,ForeignKey("student.id")) def __repr__(self): return "<name:%s day:%s status:%s>"%(self.student.name,self.day,self.status) student=relationship("Student",backref="student_record") Base.metadata.create_all(engine) #创建表结构 #这样我们就完成了在mysql下创建了 id 为主键 ,name,password 的名为 User4的表 Session_class = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例 Session = Session_class() #生成session实例 r1=Student_record(day=1,status="yes",stu_id=1) r2=Student_record(day=2,status="yes",stu_id=2) r3=Student_record(day=2,status="no",stu_id=3) s1=Student(name="mark") s2=Student(name="json") s3=Student(name="dick") Session.add_all([s1,s2,s3,r1,r2,r3]) stu_obj=Session.query(Student).filter(Student.name=="mark").first() print(stu_obj.student_record) Session.commit() #现此才统一提交,创建数据 #综合起来就是 创一个表结构后 往里面输入数据 放在第一写法中!!!!!!
我觉得多外键的应用就是为了避免冗余,来高效的完成任务
from sqlalchemy import Integer, ForeignKey, String, Column from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship Base = declarative_base() class Customer(Base): __tablename__ = 'customer' id = Column(Integer, primary_key=True) name = Column(String) billing_address_id = Column(Integer, ForeignKey("address.id")) shipping_address_id = Column(Integer, ForeignKey("address.id")) billing_address = relationship("Address") shipping_address = relationship("Address") class Address(Base): __tablename__ = 'address' id = Column(Integer, primary_key=True) street = Column(String) city = Column(String) state = Column(String)
#执行你会发现,会返回错误(原因是因为返回的时候无法判别billing和shipping两者,所以将这一部分改掉,就能够辨别了!
class Customer(Base): __tablename__ = 'customer' id = Column(Integer, primary_key=True) name = Column(String) billing_address_id = Column(Integer, ForeignKey("address.id")) shipping_address_id = Column(Integer, ForeignKey("address.id")) billing_address = relationship("Address", foreign_keys=[billing_address_id]) shipping_address = relationship("Address", foreign_keys=[shipping_address_id])
#应用场景
类似这种能使某个人同时关联两个模块,而且不产生冗余,像上面第一种,我们手动的输入stu_id的话虽然能关联 但我们会产生大量的冗余数据,浪费资源