ORM简介
官方:对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
关系型数据库中数据的存储都是类似二维表的方式,从数据库查询表的数据结果在python中是一个list对象,每个人list元素为为tuple元素。如果随意取出tuple元素需要用2层循环语句才可以实现,为了解决这种python中面向对象和关系数据库不匹配依赖了
SQLalchemy
简介
用法:
第一步,导入系统模块,创建连接
import sqlalchemy
from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://root:123456@localhost/python",echo=True)
数据库连接默认2.X支持mysqldb,3.X支持pymysql,"mysql+pymysql"解决找不到数据库连接的问题。
数据库连接格式:mysql+mysql://数据库账户:密码@主机IP/数据库名
echo 值等于True时显示每条执行sql语句,可关闭
创建表操作
1.通过sql创建表
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine("mysql+pymysql://root:123456@localhost/python",echo=True) #2.X支持mysqdb,3.X支持pymysql
sql ='''create table student(
id int not null primary key,
name varchar(50),
age int,
address varchar(100));''' #创建表操作sql
conn = engine.connect() #获取数据库连接
conn.execute(sql) #执行sql创建表语句
conn.close() #关闭连接
2.通过orm创建表
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy import MetaData
from sqlalchemy import Column,Integer,String,Table
engine=create_engine("mysql+pymysql://root:123456@localhost/python",echo=True)
metadata=MetaData(engine) #用于保存表结构,绑定数据库源
user = Table('user', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(20)),
Column('fullname', String(40))
)
metadata.create_all(engine)
conn=engine.connect()
conn.close()
metadata.create_all() 用于安全创建表,创建之前会查询表是否存在。
Table对象
table(self,"table_name",metadata,*args,**kwargs)
tablen_name 表的名字
metadata 共享对象
*args 数据库表列
**kwargs 可变参数
schema 此表的结构名称,默认None
autoload 自动从现有表中读入表结构,默认False
autoload_with 从其他engine读取结构,默认None
include_columns如果autoload设置为True,则此项数组中的列明将被引用,没有写的列明将被忽略,None表示所有都列明都引用,默认None
mustexist 如果为True,表示这个表必须在其他的python应用中定义,必须是metadata的一部分,默认False
useexisting 如果为True,表示这个表必须被其他应用定义过,将忽略结构定义,默认False
owner 表所有者,用于Orcal,默认None
quote 设置为True,如果表明是SQL关键字,将强制转义,默认False
quote_schema 设置为True,如果列明是SQL关键字,将强制转义,默认False
mysql_engine mysql专用,可以设置'InnoDB'或'MyISAM'
Column对象
Column(self,name,type,*args,**kwargs)
name 字段名称
type 字段类型
*args
Constraint(约束)、ForeignKey(外键)、Default(默认), Sequenceobjects(序列)定义。
可变参数 **kwargs
primary_key 如果为True,则是主键nullable 是否可为Null,默认是True
default 默认值,默认是None
index 是否是索引,默认是True
unique 是否唯一键,默认是False
onupdate 指定一个更新时候的值,这个操作是定义在SQLAlchemy中,不是在数据库里的,当更新一条数据时设置,大部分用于updateTime这类字段
autoincrement 设置为整型自动增长,只有没有默认值,并且是Integer类型,默认是True
quote 如果列明是关键字,则强制转义,默认False
session对象
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column
from sqlalchemy import Integer
from sqlalchemy import String
engine=create_engine("mysql+pymysql://root:123456@localhost/python",echo=True,connect_args={'charset':'utf8'}) #创建数据库连接
DBSession=sessionmaker(bind=engine) #创建一个session工厂
session=DBSession()
Base=declarative_base() #
class Student(Base):
__tablename__ = 'python_student'
id = Column(Integer,primary_key = True)
name = Column(String(20))
age = Column(Integer)
address = Column(String(100))
student1 = Student(id=1,name='张三',age=22,address='北京') #实例化
student2 = Student(id=2,name='李四',age=23,address='河北')
student3 = Student(id=3,name='刘大',age=25,address='天津')
session.add(student1) #填个单个对象
session.add_all([student2,student3])
session.commit() #提交语句
session.close() #关闭连接
过滤器filter
filter(过滤器)和filter_by的区别
filter需要类型.属性调用对象,使用==判断条件,可以使用>和<逻辑判断,filter_by不需要用类型.属性的方式调用对象,直接用属性调用对象,可以使用<和>逻辑判断。
举例:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column
from sqlalchemy import Integer
from sqlalchemy import String
engine=create_engine("mysql+pymysql://root:123456@localhost/python",connect_args={'charset':'utf8'}) #创建数据库连接
DBSession=sessionmaker(bind=engine) #创建一个session工厂
session=DBSession()
Base=declarative_base() #
class Student(Base):
__tablename__ = 'python_student'
id = Column(Integer,primary_key = True)
name = Column(String(20))
age = Column(Integer)
address = Column(String(100))
shuxing=session.query(Student).filter(Student.id==1).first() #filter过滤
shuxing2=session.query(Student).filter_by(id=2).first() #filter_by过滤
a=shuxing.id
b=shuxing2.id
print(a)
print(b)
结果:
D:\mypython\venv\Scripts\python.exe D:\mypython\session.py
1
2
Process finished with exit code 0