SQLAlchemy学习
www.cnblogs.com/alex3714/articles/5978329.html
1. ORM介绍
orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sql语言。
orm的优点:
- 隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。他使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。
- ORM使我们构造固化数据结构变得简单易行。
缺点:
- 无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。
2. sqlalchemy安装
在Python中,最有名的ORM框架是SQLAlchemy。用户包括openstack\Dropbox等知名公司或应用,主要用户列表http://www.sqlalchemy.org/organizations.html#openstack
Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:
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
安装sqlalchemy
pip install SQLAlchemy
pip install pymysql #由于mysqldb依然不支持py3,所以这里我们用pymysql与sqlalchemy交互
3.sqlalchemy基本使用
下面我们创建一个表是这样的
CREATE TABLE user ( id INTEGER NOT NULL AUTO_INCREMENT, name VARCHAR(32), password VARCHAR(64), PRIMARY KEY (id) )
import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String engine = create_engine("mysql+pymysql://root:alex3714@localhost/testdb", encoding='utf-8', echo=True) Base = declarative_base() #生成orm基类 class User(Base): __tablename__ = 'user' #表名 id = Column(Integer, primary_key=True) name = Column(String(32)) password = Column(String(64)) Base.metadata.create_all(engine) #创建表结构
除上面的创建之外,还有一种创建表的方式,虽不常用,但还是看看吧
from sqlalchemy import Table, MetaData, Column, Integer, String, ForeignKey from sqlalchemy.orm import mapper metadata = MetaData() 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) #the table metadata is created separately with the Table construct, then associated with the User class via the mapper() function
事实上,我们用第一种方式创建的表就是基于第2种方式的再封装。
最基本的表我们创建好了,那我们开始用orm创建一条数据试试
Session_class = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例 Session = Session_class() #生成session实例 user_obj = User(name="Jack",password="123") #生成你要创建的数据对象 print(user_obj.name,user_obj.id) #此时还没创建对象呢,不信你打印一下id发现还是None Session.add(user_obj) #把要创建的数据对象添加到这个session里, 一会统一创建 print(user_obj.name,user_obj.id) #此时也依然还没创建 Session.commit() #现此才统一提交,创建数据
1 #!/usr/bin/env python3 2 #-*- coding:utf-8 -*- 3 ''' 4 Administrator 5 2018/11/8 6 ''' 7 import sqlalchemy 8 from sqlalchemy import create_engine 9 from sqlalchemy.ext.declarative import declarative_base 10 from sqlalchemy import Column, Integer, String,Time,Enum,ForeignKey,DateTime 11 from sqlalchemy.orm import sessionmaker,relationship 12 13 engine = create_engine("mysql+pymysql://root:ss@123@localhost/kaige", 14 encoding='utf-8')# echo=True 15 16 Base = declarative_base() # 生成orm基类 17 18 19 class User(Base): 20 __tablename__ = 'user' # 用户 21 id = Column(Integer, primary_key=True) #不能为空 int 22 name = Column(String(32),nullable=False) #不能为空 23 password = Column(String(64),nullable=False) #不能为空 24 gender=Column(Enum("M","F"),default="M") 25 26 27 class Project(Base): 28 __tablename__ = 'project' # 工程列表 29 id = Column(Integer, primary_key=True) 30 name = Column(String(32),nullable=False) #不能为空 31 ctime = Column(DateTime, nullable=False) # 创建时间 datetime.datetime 32 user_id = Column(Integer,ForeignKey("user.id")) # 修改人员 要用外键连接 33 34 user=relationship("User",backref="my_project") # 35 36 def __repr__(self): 37 return "<%s %s %s %s>"%(self.id,self.name,self.ctime,self.user.name) 38 39 40 class Edition(Base): 41 __tablename__='edition' #版本控制 42 id = Column(Integer, primary_key=True) #不能为空 43 name=Column(String(32))#版本名称 不能为空 44 stime = Column(DateTime,nullable=False) # 最近一次修改保存时间 datetime.datetime 45 project_id = Column(Integer,ForeignKey("project.id")) #对应的版本控制 要用外键连接 不能为空 46 47 48 49 class Statistics(Base):#概算表构件名称# 概算统计表主表 50 __tablename__ = 'statistics' # 概算统计表主表 51 id = Column(Integer, primary_key=True)#主键 52 num = Column(Integer) # 序号 可以为空 53 name = Column(String(32),nullable=False) #构件名称 不能为空 54 count = Column(String(32)) #数量 可以为空 55 size=Column(String(32)) #基本尺寸,可以为空 56 edition_id = Column(Integer, ForeignKey("edition.id")) # 对应的版本控制 要用外键连接 不能为空 57 58 class Items(Base): #概算统计表主表 59 __tablename__ = 'items' 60 id = Column(Integer, primary_key=True)#主键 61 itemName = Column(String(64)) #概算项目 可以为空 62 quota = Column(String(32)) #概算定额号 可以为空 63 quantities=Column(String(32)) #工程量 可以为空 64 unit=Column(String(32)) #单位 可以为空 65 statistics_id=Column(Integer,ForeignKey("statistics.id")) 66 67 Base.metadata.create_all(engine) # 创建表结构 68 69 Session_class = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例 70 Session = Session_class() #生成session实例 71 72 u1=User(name="admin",password="123") 73 u2=User(name="admin1",password="123",gender="F") 74 u3=User(name="admin2",password="123") 75 u4=User(name="admin3",password="123",gender="F") 76 import datetime 77 p1=Project(name="project111111",user_id=1,ctime=datetime.datetime.now()) 78 p2=Project(name="project222222",user_id=1,ctime=datetime.datetime.now()) 79 p3=Project(name="project333333",user_id=2,ctime=datetime.datetime.now()) 80 p4=Project(name="project444444",user_id=3,ctime=datetime.datetime.now()) 81 82 e1=Edition(name="v0.01",stime=datetime.datetime.now(),project_id=1) 83 e2=Edition(name="v0.02",stime=datetime.datetime.now(),project_id=1) 84 e3=Edition(name="v0.03",stime=datetime.datetime.now(),project_id=1) 85 e4=Edition(name="v0.01",stime=datetime.datetime.now(),project_id=2) 86 87 s1=Statistics(num=1,name="goujian001",count=1,edition_id=1) 88 s2=Statistics(num=2,name="goujian002",count=1,edition_id=1) 89 s3=Statistics(num=3,name="goujian003",count=1,edition_id=1) 90 s4=Statistics(num=1,name="goujian001",count=1,edition_id=2) 91 s5=Statistics(num=2,name="goujian002",count=1,edition_id=2) 92 s6=Statistics(num=3,name="goujian003",count=1,edition_id=2) 93 s7=Statistics(num=1,name="goujian001",count=1,edition_id=3) 94 95 i1=Items(itemName="item01",statistics_id=1) 96 i2=Items(itemName="item02",statistics_id=1) 97 i3=Items(itemName="item03",statistics_id=2) 98 i4=Items(itemName="item04",statistics_id=2) 99 i5=Items(itemName="item05",statistics_id=2) 100 101 # Session.add_all([u1,u2,u3,u4,p1,p2,p3,p4,e1,e2,e3,e4,s1,s2,s3,s4,s5,s6,s7,i1,i2,i3,i4,i5]) 102 # Session.add_all([i1,i2,i3,i4,i5]) 103 # Session.commit() 104 105 user_obj=Session.query(User).filter(User.name=="admin").first() 106 print(user_obj.my_project)
结果:
F:\DM\DataM\venv\Scripts\python.exe F:/DM/DataM/db/data_m_db.py [<1 project111111 2018-11-08 13:43:46 admin>, <2 project222222 2018-11-08 13:43:46 admin>] Process finished with exit code 0