'''
对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 。
从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。
'''
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String
from sqlalchemy.orm import sessionmaker
from sqlalchemy import func
#指定连接信息
#可以使用的连接类型 MySQL-Python,pymysql , MySQL-Connector,cx_Oracle
engine= create_engine('mysql+pymysql://root:123@localhost/mydb',encoding='utf-8',echo=True)
#生成ORM基类
Base=declarative_base()
class User(Base):
__tablename__='user2' #表名
#声明列
id = Column(Integer,primary_key=True,autoincrement=True)
name=Column(String(32))
password = Column(String(64))
def __repr__(self):
return "<%s name : %s>"%(self.id ,self.name)
class Student(Base):
__tablename__ = 'student' # 表名
# 声明列
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(32))
def __repr__(self):
return "<%s name : %s>" % (self.id, self.name)
#创建表结构
Base.metadata.create_all(engine)
'''与数据库交互'''
#创建与数据库连接的会话 , 这里返回的是一个类
Session_class = sessionmaker(bind=engine)
#生成 session 实例
Session = Session_class()
#
# user_obj = User(name='xiaowan',password='123456')
# print(user_obj.name,user_obj.id)
#
# #将数据添加到session 中
# Session.add(user_obj)
#查询,返回一个对象
#data = Session.query(User).filter(id>2).filter(id<5).all()
data = Session.query(User).filter_by(id='1').first()
print(data)
#修改
# data.name='xiaoxiao'
#统计数量
print(Session.query(User).filter(User.name.like("x%")).count() )
#分组统计
print(Session.query(func.count(User.name),User.name).group_by(User.name).all())
#回滚
# Session.rollback()
#连接查询
print(Session.query(User,Student).filter(User.id ==Student.id).all())
#提交
Session.commit()
添加外键:
'''
外键
'''
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,ForeignKey
from sqlalchemy.orm import sessionmaker,relationship
from sqlalchemy import func
#指定连接信息
#可以使用的连接类型 MySQL-Python,pymysql , MySQL-Connector,cx_Oracle
engine= create_engine('mysql+pymysql://root:123@localhost/mydb',encoding='utf-8',echo=True)
#生成ORM基类
Base=declarative_base()
class Student(Base):
__tablename__ = 'student' # 表名
# 声明列
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(32))
def __repr__(self):
return "<%s name : %s>" % (self.id, self.name)
class StudyRecord(Base):
__tablename__ = 'Study_record'
id = Column(Integer, primary_key=True, autoincrement=True)
day = Column(Integer,nullable=False)
statrus = Column(String(32),nullable=False)
#外键关联student id
stu_id = Column(Integer,ForeignKey("student.id"))
#添加一个关系 ,让StudyRecord可以调用student
student = relationship("Student", backref="my_study_record")
def __repr__(self):
return "<%s day:%s status:%s>" % (self.student.name,self.day,self.statrus)
#生成表结构
Base.metadata.create_all(engine)
#创建与数据库连接的会话 , 这里返回的是一个类
Session_class = sessionmaker(bind=engine)
#生成 session 实例
session = Session_class()
# s1 = Student(name='aaa')
# s2 = Student(name='bbb')
# s3 = Student(name='ccc')
# s4 = Student(name='ddd')
#
# obj1 = StudyRecord(day=1,statrus="Y",stu_id=1)
# obj2 = StudyRecord(day=2,statrus="Y",stu_id=1)
# obj3 = StudyRecord(day=3,statrus="Y",stu_id=1)
# obj4 = StudyRecord(day=1,statrus="Y",stu_id=2)
# 查询
stu_obj = session.query(Student).filter(Student.name=="aaa").first()
print("---------------------")
print(stu_obj.my_study_record)
# session.add_all([s1,s2,s3,s4,obj1,obj2,obj3,obj4])
# session.commit()
多外键:
from sqlalchemy import Integer,ForeignKey,String,Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship,sessionmaker
from sqlalchemy import create_engine,ForeignKey
Base = declarative_base()
class Customer(Base):
__tablename__='customer'
id = Column(Integer,primary_key=True)
name= Column(String(64))
#外键
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])
class Address(Base):
__tablename__='address'
id = Column(Integer,primary_key=True)
street = Column(String(64))
city = Column(String(64))
state = Column(String(64))
def __repr__(self):
return self.street
engine= create_engine('mysql+pymysql://root:123@localhost/mydb',encoding='utf-8',echo=True)
Base.metadata.create_all(engine)
#创建与数据库连接的会话 , 这里返回的是一个类
Session_class = sessionmaker(bind=engine)
#生成 session 实例
session = Session_class()
# #插入数据
#
# addr1 = Address(street="FT",city="fengtai",state="beijing")
# addr2 = Address(street="CY",city="chaoyang",state="beijing")
# addr3 = Address(street="PD",city="pudong",state="shanghai")
#
# session.add_all([addr1,addr2,addr3])
#
# c1 = Customer(name="xiaoqiang",billing_address=addr1,shipping_address=addr2)
# c2 = Customer(name="jack",billing_address=addr3,shipping_address=addr3)
#
# session.add_all([c1,c2])
#查询
obj = session.query(Customer).filter(Customer.name=="xiaoqiang").first()
print(obj.name,obj.billing_address,obj.shipping_address)
session.commit()
多对多关系:
from sqlalchemy import Integer,ForeignKey,String,Column,Table
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship,sessionmaker
from sqlalchemy import create_engine,ForeignKey
Base = declarative_base()
book_m2m_author = Table('book_m2m_author',Base.metadata,
Column('book_id',Integer,ForeignKey('book.id')),
Column('author_id',Integer,ForeignKey('author.id'))
)
#book table
class Book(Base):
__tablename__='book'
id = Column(Integer,primary_key=True)
name = Column(String(64))
authors = relationship('Author',secondary=book_m2m_author ,backref='books')
def __repr__(self):
return self.name
#Author table
class Author(Base):
__tablename__ = 'author'
id = Column(Integer,primary_key=True)
name= Column(String(64))
def __repr__(self):
return self.name
engine= create_engine('mysql+pymysql://root:123@localhost/mydb?charset=utf8',encoding='utf-8',echo=True)
Base.metadata.create_all(engine)
#创建与数据库连接的会话 , 这里返回的是一个类
Session_class = sessionmaker(bind=engine)
#生成 session 实例
session = Session_class()
#
# #插入数据
# b1= Book(name='java')
# b2= Book(name='c#')
# b3= Book(name='python')
b3 = Book(name='语文')
#
#
# a1= Author(name='jack')
# a2= Author(name='raun')
# a3= Author(name='tran')
#
#
#
# b1.authors=[a1,a3]
# b2.authors=[a2,a3]
# b3.authors=[a1,a2,a3]
#
#
# session.add_all([b1,b2,b3,a1,a2,a3])
session.add_all([b3])
#查询jack 的书
author_obj = session.query(Author).filter(Author.name=='jack').first()
print("------------------------")
print(author_obj.books)
#java 书的作者
book_obj = session.query(Book).filter(Book.name=='java').first()
print("------------------------")
print(book_obj.authors)
session.commit()