ORM

            对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
            面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。
            对象关系映射(Object-Relational Mapping)提供了概念性的、易于理解的模型化数据的方法。ORM方法论基于三个核心原则: 简单:以最基本的形式建模数据。 传达性:数据库结构被任何人都能理解的语言文档化。 精确性:基于数据模型创建正确标准化的结构。 典型地,建模者通过收集来自那些熟悉应用程序但不熟练的数据建模者的人的信息开发信息模型。建模者必须能够用非技术企业专家可以理解的术语在概念层次上与数据结构进行通讯。建模者也必须能以简单的单元分析信息,对样本数据进行处理。ORM专门被设计为改进这种联系。
简单的说:ORM相当于中继数据。具体到产品上,例如ADO.NET Entity Framework。DLINQ中实体类的属性[Table]就算是一种中继数据。
            在Python中,最有名的ORM框架是SQLAlchemy。

SqlAlchemy ORM  

SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。

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

简单操作:
#!/usr/bin/env python
# Version = 3.5.2
# __auth__ = '无名小妖'
from sqlalchemy import create_engine

# pymysql://root:123456@192.168.168.231:3306/test
# 连接数据库的模块://用户名:密码@ip:端口/数据库
engine = create_engine("mysql+pymysql://root:123456@192.168.168.231:3306/test", max_overflow=5)

engine.execute(
"INSERT INTO hosts VALUES ('2', 'v1')"
)

engine.execute(
"INSERT INTO hosts VALUES (%s, %s)",
((555, "v1"), (666, "v1"),)
)
engine.execute(
"INSERT INTO hosts VALUES (%(id)s, %(name)s)",
id=999, name="v1"
)

result = engine.execute('select * from hosts')
ret = result.fetchall()
print(ret)

-----------------------------------------------------------------end----------------------------------------------------------

创建表

#!/usr/bin/env python
# Version = 3.5.2
# __auth__ = '无名小妖'
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey

metadata = MetaData() # 类

user = Table('user', # 表名
metadata, # 绑定
Column('id', Integer, primary_key=True), # 列名
Column('name', String(20)), # 列名
)

color = Table('color', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(20)),
)

engine = create_engine("mysql+pymysql://root:123456@192.168.168.231:3306/test", max_overflow=5)

metadata.create_all(engine) # 创建上面定义的表

engine.execute(
"INSERT INTO color VALUES (%(id)s, %(name)s)",
id=999, name="alex"
)

result = engine.execute('select * from color')
ret = result.fetchall()
print(ret)
-----------------------------------------------------------------end----------------------------------------------------------
增删改查
#!/usr/bin/env python
# Version = 3.5.2
# __auth__ = '无名小妖'
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey, select

engine = create_engine("mysql+pymysql://root:123456@192.168.168.231:3306/test", max_overflow=5)

metadata = MetaData()

user = Table('user', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(20)),
)

color = Table('color', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(20)),
)

conn = engine.connect()

# 创建SQL语句,INSERT INTO "user" (id, name) VALUES (:id, :name)
# conn.execute(user.insert(), {'id': 7, 'name': 'seven'})
# sql = user.insert().values(id=123, name='wu')
# conn.execute(sql)
# conn.close()

# sql = user.delete().where(user.c.id > 1)

# sql = user.update().values(fullname=user.c.name)
# sql = user.update().where(user.c.name == 'jack').values(name='ed')

sql = select([user, ])
ret = conn.execute(sql)
print(ret)
# sql = select([user.c.id, ])
# sql = select([user.c.name, color.c.name]).where(user.c.id==color.c.id)
# sql = select([user.c.name]).order_by(user.c.name)
# sql = select([user]).group_by(user.c.name)

# result = conn.execute(sql)
# print result.fetchall()
# conn.close()
-----------------------------------------------------------------end----------------------------------------------------------

实际使用的例子
#!/usr/bin/env python
# Version = 3.5.2
# author = '无名小妖'
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

Base = declarative_base() # 生成一个SqlORM 基类

engine = create_engine("mysql+mysqldb://root@localhost:3306/test", echo=False)

class Host(Base):
__tablename__ = 'hosts'
id = Column(Integer, primary_key=True, autoincrement=True)
hostname = Column(String(64), unique=True, nullable=False)
ip_addr = Column(String(128), unique=True, nullable=False)
port = Column(Integer, default=22)

Base.metadata.create_all(engine) # 创建所有表结构

if __name__ == '__main__':
SessionCls = sessionmaker(bind=engine) # 创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
session = SessionCls()
# h1 = Host(hostname='localhost',ip_addr='127.0.0.1')
# h2 = Host(hostname='ubuntu',ip_addr='192.168.2.243',port=20000)
# h3 = Host(hostname='ubuntu2',ip_addr='192.168.2.244',port=20000)
# session.add(h3) #可以一个一个添加
# session.add_all( [h1,h2]) # 也可以全部添加
# h2.hostname = 'ubuntu_test' #只要没提交,此时修改也没问题
# 想要修改需得先查询
# res = session.query(Host).filter(Host.hostname.in_(['ubuntu2', 'localhost'])).all() # all查出所有
# print(res)
# obj = session.query(Host).filter(Host.hostname=='localhost').first() # first查出第一条
# print(obj)
# obj.hostname = 'test data'
# 删除数据
# session.delete(obj)
# session.rollback() # 回滚
# session.commit() # 提交



循序渐进Python3(十)-- 2 -- SqlAlchemy的更多相关文章

  1. Python3.x:SQLAlchemy操作数据库

    Python3.x:SQLAlchemy操作数据库 前言 SQLAlchemy是一个ORM框架(Object Rational Mapping,对象关系映射),它可以帮助我们更加优雅.更加高效的实现数 ...

  2. 循序渐进Python3(十)-- 3 -- SqlAlchemy

    使用sqlalchemy 创建外键关联 ), ), ) host_user = Column(String(), ), ), ]).first()for item in works.workinfo: ...

  3. 循序渐进Python3(十二) --2--  web框架之django简单实现oracle数据库操作

    在 Django 中构建 Oracle 数据库支持的 Web 应用程序 了解如何配置 Django 以便与 Oracle 数据库交互,并使用 ORM 进行数据库连接.             产能在软 ...

  4. 循序渐进Python3(十二) --0--  web之框架

    web框架的本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #coding:utf ...

  5. 循序渐进Python3(十二) --1--  web框架之django

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为: 大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能 ...

  6. 循序渐进Python3(十)-- 1 -- pymysql

    使用pymsql 模块操作数据库 #!/usr/bin/env python , ),()]), user='root', passwd='123456', db='test')# 创建游标curso ...

  7. 循序渐进Python3(十)-- 4 -- paramiko

    paramiko模块,基于SSH用于连接远程服务器并执行相关操作. 使用 (1)SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: , ))transport.connect( ...

  8. 循序渐进Python3(十)-- 0 -- RabbitMQ

    RabbitMQ     RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息 ...

  9. 循序渐进Python3(十一) --5-- 同源策略

    一.什么是同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能.它是由Netscape提出的一个著名的安全策略,现在所有的可支持javascript ...

随机推荐

  1. 简单了解undo

    ORACLE 数据库 DML语句执行之前,会将数据块修改前的信息 镜像保存到 undo 段 insert语句     rollback    将会执行一条deleter操作  (相对数据量最小,只需利 ...

  2. emacs配置eslint 语法检查.找不到node解决

    使用emacs配置eslint 当调用语法检查时报错 Suspicious state from syntax checker javascript-eslint: Checker javascrip ...

  3. 利用nodejs搭建服务器,测试AJAX

    最近学习了AJAX一直没有进行过测试,前今天了解了Noejs搭建本地服务器下就尝试了一下.通过AJAX请求的方式获取HTTP服务器返回数据的代码 首先创建一个serve.js的文件.并写入以下代码. ...

  4. dubbo入门示例

    前提准备: 在本次实验之前,需要准备一下几个包: Spring中的aop.beans.context.core.expression以及struts中的commons-logging.javassis ...

  5. Android动态加载学习笔记(一)

    前言 上周五DPAndroid小分队就第二阶段分享内容进行了讨论,结果形成了三个主题:性能优化.动态加载.内核远离.我选择的是第二项——动态加载.在目前的Android开发中,这一部分知识还是比较流行 ...

  6. 为tomcat动态添加jndi数据源信息

    我们在开发项目的时候,总要和数据库打交道,如何获取数据源,以什么样的方式来获取,成为了我们即简单又熟悉而且不得不注意的一个问题. 那么在这里我说三种获取数据源的常用方式: 一.通过配置文件来获取 首先 ...

  7. 单片网络接口芯片W5100的原理与应用

    随着计算机网络技术的发展,作为全球最大计算机网络——I n t e r ac t已成为当今信息社会重要的基础信息设施.在工业测控.智能仪器.智能家庭等领域,大量应用嵌入式设备接人 I n t e r ...

  8. openlayers优化项

    做了一个简单的样式,但是做的不怎么样:希望和大家讨论下载动态图那里,怎么能够提高效率,提高数据,能够快速反应:一般的处理方法是什么?

  9. lintcode-【中等】恢复IP地址

    题目 给一个由数字组成的字符串.求出其可能恢复为的所有IP地址.链接. 样例 给出字符串 "25525511135",所有可能的IP地址为: [ "255.255.11. ...

  10. Linux 用户和用户组管理

    Linux 用户和用户组管理 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统. 用户的账号一方面可以帮助 ...