ORM是建立在SQL语言构造器之上的工具集,用于将Python对象映射到数据库的行,提供了一系列接口用于从数据库中存取对象(行)。在ORM 工作时,在底层调用SQL语言构造器的API,这些通用的操作有些许的不同。不同的是,你不再使用行,而是使用自定义类的对象来操作。另外,数据库的查询 方式也不同,ORM的可以生成大多数的SQL查询,除此之外还可以在类中定义更多操作

1)检查sqlalchemy版本

>>> import sqlalchemy
>>> sqlalchemy.__version__
'1.2.0b2'

2) 建立连接connecting

>>> from sqlalchemy import create_engine
>>> engine=create_engine("mysql+pymysql://admin:admin@192.168.6.22/coursesys?charset=utf8",encoding="utf-8",echo=True) 1)通过create_engine()建立连接,create_engine是 Engine实例,create_engine第一次调用的时候会调用Engine.execute()或者 Engine.connect()方法,
通过dialect在数据库和DBAPI之间建立连接关系。
注意:返回create_engine对象并没有连接到数据库。只有在执行第一次要求对数据库时才连接
2)echo是SQLAlchemy logging 是个标准logging模型。当echo 为True看到所有生成的SQL;希望少输出,设置它 False
3)mysql+pymysql://admin:admin@192.168.6.22/coursesys?charset=utf8 是个dialect连接
4)engine=create_engine('sqlite:///:memory:',echo=True)将使用一个只在内存中SQLite数据库

3)声明映射

我们使用ORM:映射类与数据库表。SQLAlchemy在中首先通过declarative_base申明一个基类。这个基类维持着类与数据库表的关系

>>> from sqlalchemy.ext.declarative import declarative_base
>>> Base=declarative_base()

  声明表第一种方式:在自定义类继承declarative_base这个基类来映射数据表

  

>>>  class User(Base):
__tablename__="users"
id=Column(Integer,primary_key=True)
name=Column(String)
fullname=Column(String)
password=Column(String)
def __repr__(self):
return "User(name=%s,fullname=%s,password=%s" %(self.name,self.fullname,self.password)

  __tablename__指定表名
  Column 指定字段
  primary_key 设置主键
  __repr__ 当打印User对象时显示的数据。
声明表第二种方式:通过模式声明,通过__table__可以查看定义表元数据。

  

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)
>>> User.__table__
Table('users', MetaData(bind=None), Column('id', Integer(), table=<users>, prima
ry_key=True, nullable=False), Column('name', String(), table=<users>), Column('f
ullname', String(), table=<users>), schema=None)
MetaData是一个注册表包括能够一组执行的命令到数据库,上面声明了表的类,但是数据库中并没有创建表,
通过Base.metadata.create_all(engine)向数据库发出建表完成类与表的映射

4)建立表

>>Base.metadata.create_all(engine)

2017-08-17 14:51:37,117 INFO sqlalchemy.engine.base.Engine SELECT CAST('test pla
in returns' AS VARCHAR(60)) AS anon_1
2017-08-17 14:51:37,117 INFO sqlalchemy.engine.base.Engine ()
2017-08-17 14:51:37,117 INFO sqlalchemy.engine.base.Engine SELECT CAST('test uni
code returns' AS VARCHAR(60)) AS anon_1
2017-08-17 14:51:37,117 INFO sqlalchemy.engine.base.Engine ()
2017-08-17 14:51:37,133 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("us
ers")
2017-08-17 14:51:37,133 INFO sqlalchemy.engine.base.Engine ()
2017-08-17 14:51:37,133 INFO sqlalchemy.engine.base.Engine
CREATE TABLE users (
id INTEGER NOT NULL,
name VARCHAR,
fullname VARCHAR,
PRIMARY KEY (id)
) 2017-08-17 14:51:37,133 INFO sqlalchemy.engine.base.Engine ()
2017-08-17 14:51:37,133 INFO sqlalchemy.engine.base.Engine COMMIT

5)字段长度

  在上面的String中我们并没有指明长度,在SQLite和PostgreSQL是有效的,但是在mysql等中String,Integer, Numeric等会报错需要指定长度
  Column(String(50))

  在oracleo等数据库中,有可能需要用到序列,你可以通过Sequence来使用
  from sqlalchemy import Sequence
  Column(Integer, Sequence('user_id_seq'), primary_key=True)

    class User(Base):
__tablename__ = 'users'
id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
name = Column(String(50))
fullname = Column(String(50))
password = Column(String(12)) def __repr__(self):
return "<User(name='%s', fullname='%s', password='%s')>" % (
self.name, self.fullname, self.password)

6)建立会话

  1)通过 Session处理ORM和数据表。
两种方式:声明并绑定engine
>>> from sqlalchemy.orm import sessionmaker
>>> Session = sessionmaker(bind=engine)
   2) 如果还没有engine,先创建engine,在通过configure绑定到session
    Session = sessionmaker()
Session.configure(bind=engine)
    上面通过sessionmaker创建是一个类,需要实例类
    session=Session()

7)增加修改数据

>>> ed_user=User(name="ed",fullname="ed Jone")
>>> session.add(ed_user)

 8)获取自曾ID

  

ed_user.id

 9)查看数据

  

>>> our_user = session.query(User).filter_by(name='ed').first()
>>> our_user
<User(name='ed', fullname='Ed Jones', password='edspassword'

 10)修改数据

ed_user.fullname = ''

  session.dirty 修改数据后,数据变为脏数据,可以通过dirty查看
  IdentitySet([<User(name='ed', fullname='11111'>])

11)增加一组数据

session.add_all([
... User(name='wendy', fullname='Wendy Williams'),
... User(name='mary', fullname='Mary Contrary'),
... User(name='fred', fullname='Fred Flinstone']) session.new #表示查看新增加的数据
IdentitySet([<User(name='wendy', fullname='Wendy Williams', password='foobar')>,
<User(name='mary', fullname='Mary Contrary', password='xxg527')>,
<User(name='fred', fullname='Fred Flinstone', password='blah')>])

12) 提交数据回滚数据

上面的数据并没有在数据库中,需要通过commit()方法把数据提交到数据库中,获取通过rollback回滚数据。
commit()确认数据

Session.rollback()回滚数据。
mysql> select * from users;
Empty set (0.00 sec) sesstion.commit() mysql> select * from users;
+----+------+----------+----------+
| id | name | fullname | password |
+----+------+----------+----------+
| 1 | shi | shi jun | 123456 |
+----+------+----------+----------+
1 row in set (0.00 sec)
# -*- coding:utf-8 -*-
__author__ = 'shisanjun' import sqlalchemy
from sqlalchemy import Column,Integer,String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker #创建连接
engine=sqlalchemy.create_engine("mysql+pymysql://admin:admin@192.168.0.121/test2?charset=utf8",echo=True) #声明ORM映射基类
BASE=declarative_base() class User(BASE):
__tablename__="users" #指定表名
id=Column(Integer,primary_key=True) #建立主键
name=Column(String(32))
fullname=Column(String(32))
password=Column(String(32)) def __repr__(self): #返回对象时打印显示
return "name:%s full name:%s password:%s" %(self.name,self.fullname,self.password) #向数据库发出建表,完成类与表的映射,在数据库中生成所有继承declarative_base表
BASE.metadata.create_all(bind=engine)
#声明会话类
Session=sessionmaker(bind=engine)
#实例化会话类
session=Session() #增加数据
user1=User(name="ed",fullname="ed jone",password="123456")
#增加一条数据
session.add(user1)
#查看自增ID号
print(user1.id)
#增加多条数据
session.add_all([
User(name="shi",fullname="shi jone",password="123456"),
User(name="san",fullname="san jone",password="123456"),
User(name="jun",fullname="jun jone",password="123456"),
])
#查看新增数据
print(session.new) #修改数据
user1.fullname="tianshi" #查看脏数据
print(session.dirty) #上面的数据并没有提交到数据库中,数据还在内存中 #把sesstion事务数据提交到数据库中
session.commit()
#把数据从session事务中剔除
#session.rollback()

SQLAlchemy-对象关系教程ORM-create的更多相关文章

  1. Object Relational Tutorial 对象关系教程

    The SQLAlchemy Object Relational Mapper presents a method of associating user-defined Python classes ...

  2. Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包

    Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...

  3. 对象关系映射ORM

    对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效 ...

  4. Django 源码小剖: Django 对象关系映射(ORM)

    引 从前面已经知道, 一个 request 的到来和一个对应 response 的返回的流程, 数据处理和数据库离不开. 我们也经常在 views.py 的函数定义中与数据库打交道. django O ...

  5. Python 3 对象关系映射(ORM)

    ORM 对象关系映射 Object Relational Mapping 表 ---> 类 字段 ---> 属性 记录 ---> 对象 # mysql_client.py impor ...

  6. 对象-关系映射ORM(Object Relational Mapping)(转)

    ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现 Hibernate在实现ORM功能的时候主要用到的文件有:映射类(*.java).映射文件(*.hbm.xml)和数据库配置文件 ...

  7. 通过java反射实现简单的关于MongoDB的对象关系映射(ORM).

    通过阅读MongoDB  3.2.1的官方文档中关于java 编程发现最新的文档并没有实现对对象到Document的映射,所以自己有了利用反射实现简单的关系映射. 1.定义抽象类:AbstractMo ...

  8. 对象关系映射 ORM

    1.1 作用 MTV框架中包括一个重要的部分,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因 ...

  9. 对象关系映射(ORM)框架GreenDao简介和基本使用

    官网上的介绍,greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案. GreenDao特点 性能最大化,可能是Android平台上最快的ORM框架 易于使用的A ...

  10. Python学习---django之ORM语法[对象关系映射]180124

    ORM语法[对象关系映射] ORM: 用面向对象的方式去操作数据库的创建表以及增删改查等操作. 优点:1 ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑该死的SQL语句.快速开发. 2 ...

随机推荐

  1. 【BZOJ2813】奇妙的Fibonacci

    Description ​ Fibonacci数列是这样一个数列: F1 = 1, F2 = 1, F3 = 2 . . . Fi = Fi-1 + Fi-2 (当 i >= 3) ​ pty忽 ...

  2. NOIWC前的交流题目汇总

    RT 2018.12.27 i207M:BZOJ 4695 最假女选手 以维护最大值为例,记录最大值和严格次大值和最大值的出现次数,然后取min的时候递归到小于最大值但大于次大值修改,这个就是最重要的 ...

  3. 解题:USACO13NOV No Change

    题面 在朴素中透着一点新意的状压DP 一个很暴力的思路是枚举位置,状态和硬币,每次二分出向前最多能买到哪里,复杂度爆炸($O(2^knklog$ $n)$) 考虑优化,不妨先预处理一下$goal[i] ...

  4. Apache+tomcat配置动静分离(一个apache一个tomcat,没有做集群)

    1. 下载apache http server,tomcat,mok_jk.so apache下载地址:http://httpd.apache.org/download.cgi tomcat下载地址: ...

  5. ubuntu 安装python3.6.6

    http://www.cnblogs.com/yhongji/p/9383857.html https://www.jianshu.com/p/1565f38f4236 ./configure --w ...

  6. CMake 案例

    单个源文件 # CMake 最低版本号要求 cmake_minimum_required (VERSION 3.11) # 项目信息 project (Demo) # 指定生成目标 add_execu ...

  7. Tcp协议三次握手四次挥手

    一.什么是TCP TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的.可靠的. 基于IP的传输层协议.TCP在IP报文的协议号是6. 二.什 ...

  8. C++ explicit constructor/copy constructor note

    C++:explict 作用显示声明构造函数只能被显示调用从而阻止编译器的隐式转换,类似只能用()显示调用,而不能=或者隐式调用 #include <iostream> #include ...

  9. python基础之01数据类型-变量-运算浅解

    python的数据类型 1  数字 数字分为整型(int),长整型(long),浮点型(float),复数(complex) 整型较为常用的功能: >>> a=-4 >> ...

  10. Broker流量均衡 prefer reassign

    0.均衡流量的步骤 现在的kafka集群,只要遇到过weibo_common_act2 topic的节点在ZK中丢失,就要prefer一次流量,否则不均匀. 总结均衡流量的一般步骤: 通过hpm查询b ...