ORM即object relational mapping 对象关系映射程序,可以在操作数据库的时候使用自有的语言而不必使用数据库的语言。

  在python中,最强大的ORM框架就是SQLAlchemy。基本构成如下:

首先来看看SQL Alchemy的基本用法

在使用SQL Alchemy的时候必须包子Mysql的字符集为utf-8(默认为Latin1),使用以下命令进入MySQL的配置

sudo vim /etc/mysql/my.cnf

插入信息:

[client]
default-character-set = utf8
[mysqld]
character-set-server = utf8
[mysql]
default-character-set = utf8

 下面开始正式连接数据库

from sqlalchemy import create_engine

engine = create_engine('mysql+mysqldb://root****@locahost:3306/blog#****为MySQLroot用户密码,此命令运行了默认在3306端口的blog数据库

  下面开始描述表结构:

SQL alchemy有declarative系统来进行数据库中表的结构描述,以创建user为例:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String engine = create_engine("mysql+pymysql://root:123456@localhost:3306/test2db?charset=utf8")
Base = declarative_base() # 生成基类 class User(Base):
__tablename__ = "users" # 表名
id = Column(Integer, primary_key=True,nullable=False, index=True)
name = Column(String(20),nullable=False)
password = Column(String(20),nullable=False, index=True) def __repr__(self):
return '%S'(%r)%(self.__class__.__name__,self.name)# Base.metadata.create_all(engine)#创建表结构

     创建了users的表,有三个字段(用Column语句描述),包括id,name和password,数据类型处理integer和string外还有text,Boolean,smallinteger和datetime,nullable=False表示不可为空,index=True表示在该列创建索引,并且用repr函数定义了返回输出格式

     表的本质就是各种关系的集合,那么我们来看看这些关系的定义

     一对多关系

用户跟文章肯定有一个关系,而且该关系还是一对多(一个作者对应多个文章)

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String,Text
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship engine = create_engine("mysql+mysqldb://root:123456@localhost:3306/test2db?charset = utf8") Base = declarative_base() # 生成基类 class User(Base):
__tablename__ = "users" # 表名
id = Column(Integer, primary_key=True,nullable=False, index=True)
name = Column(String(20),nullable=False)
password = Column(String(20),nullable=False, index=True)
articles = relationship('Article',backref = 'author')#连接User和Article在users中使用articles调用,在articles中使用users调用。 def __repr__(self):
return '%S'(%r)%(self.__class__.__name__,self.name)
class Article(Base):
__tablename__ = 'articles'
   article_id = Column(Integer, primary_key=True,nullable=False, index=True)
title = Column(String(255),nullable = False,index = True)
content = Column(Text)
user_id = Column(integer,ForeignKey('users.id'))
def __repr__(self):
return '%S'(%r)%(self.__class__.__name__,self.title) Base.metadata.create_all(engine)#创建表结构

 一对一关系

如果需要储存一个更详细的个人资料User_Info,其与User的映射应该是一对一的。

  

#coding:utf8
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String,Text
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship engine = create_engine("mysql+mysqldb://root:123456@localhost:3306/blog?charset = utf8") Base = declarative_base() # 生成基类
class User(Base):
__tablename__ = "users" # 表名
id = Column(Integer, primary_key=True,nullable=False, index=True)
name = Column(String(20),nullable=False)
password = Column(String(20),nullable=False, index=True)
article = relationship('Article',backref = 'author')
userinfo=relationship('userinfo',backref='author',uselist=False)#只需要将此处uselist设为False便是一对一 class Article(Base):
__tablename__ = 'articles'
article_id = Column(Integer, primary_key=True,nullable=False, index=True)
title = Column(String(255),nullable = False,index = True)
content = Column(Text)
user_id = Column(Integer,ForeignKey('users.id')) class Info_User(Base):
__tablename__='userinfo'
id=Column(Integer,primary_key=True,nullable=False,index=True)
qq=Column(String(32),nullable=False,index=True)
tel=Column(String(32),nullable=False,index=True)
user_id=Column(Integer,ForeignKey('users.id')) Base.metadata.create_all(engine)#创建表结构

  多对多的关系:

  一个文章可能有多个标签,一个标签也可能对应多本文章,这就是多对多的关系。多对多不能直接定义,需要分解为两个一对多,并引入一张额外的表来协助完成。

article_tag = Table(
'article_tag', Base.metadata,
Column('article_id', Integer, ForeignKey('articles.id'),nullable=False,primary_key=True),
Column('tag_id', Integer, ForeignKey('tags.id'),nullable=False,primary_key=True)
) class Tag(Base): __tablename__ = 'tags' id = Column(Integer, primary_key=True)
name = Column(String(64), nullable=False, index=True) def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, self.name)

  表结构已经搭好,现在开始往里面填充数据,此处我们使用faker模块来模拟数据。

    import faker
faker = Factory.create()
Session = sessionmaker(bind=engine)
session = Session()#创建了一个可以与MySQL对话的实例 faker_users = [User(
username=faker.name(),
password=faker.word(),
email=faker.email(),
) for i in range(10)]
session.add_all(faker_users) faker_categories = [Category(name=faker.word()) for i in range(5)]
session.add_all(faker_categories) faker_tags= [Tag(name=faker.word()) for i in range(20)]
session.add_all(faker_tags) for i in range(100):
article = Article(
title=faker.sentence(),
content=' '.join(faker.sentences(nb=random.randint(10, 20))),#10-20个不等长的sentence
author=random.choice(faker_users),
category=random.choice(faker_categories)
)
for tag in random.sample(faker_tags, random.randint(2, 5)):2-5个tags
article.tags.append(tag)
session.add(article) session.commit()

   通过以上代码创建了10个用户,5个分类,20个标签,100篇文章,使用 SQLAlchemy 往数据库中添加数据,我们只需要创建相关类的实例,调用 session.add() 添加一个,或者 session.add_all() 一次添加多个, 最后 session.commit() 就可以了。

  查:使用get语法,filter_by按照某一特定格式筛选(使用=),filter按照一些格式筛选(使用==),all查询所有

article = session.query(Article).get(1)

  改:

article.title = 'this is my first blog'
session.add(article)
session.commit()

  增:

article.tag.append(Tag(name='python'))
session.add(article)
session.commit()

  删:

session.delete(article)
session.commit()

  

ORM Basic的更多相关文章

  1. NHibernate官方文档中文版--基础ORM(Basic O/R Mapping)

    映射声明 对象/关系映射在XML文件中配置.mapping文件这样设计是为了使它可读性强并且可修改.mapping语言是以对象为中心,意味着mapping是围绕着持久化类声明来建立的,而不是围绕数据表 ...

  2. 基于.NET C#的 sqlite 数据库 ORM 【Easyliter】

    因为工作原因经常用到SQLITE数据库,但又找不到好用的ORM所以自个整理了一个简单好用的轻量极ORM框架:Easyliter 功能介绍: 1.支持SQL语句操作 2.支持 List<T> ...

  3. ORM框架:EF与NHibernate了解

    在.Net Framework SP1微软包含一个实体框架(Entity Framework),此框架可以理解成微软的一个ORM产品.用于支持开发人员通过对概念性应用程序模型编程(而不是直接对关系存储 ...

  4. Database ORM

    Database ORM Introduction Basic Usage Mass Assignment Insert, Update, Delete Soft Deleting Timestamp ...

  5. 【转载】ADO.NET与ORM的比较(3):Linq to SQL实现CRUD

    [转载]ADO.NET与ORM的比较(3):Linq to SQL实现CRUD 说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是Spring+Struts+Hibernate ...

  6. C# Android 开发中使用 Sqlite.NET ORM

    开发环境:VS2015 Xamarin Sqlite.NET ORM 不就相当于 Entiry Framework For Xamarin 吗? 相当于用 C# 开发安卓程序访问 Sqlite 可以使 ...

  7. @Basic表示一个简单的属性 懒加载,急加载

    5.@Basic(fetch=FetchType,optional=true) 可选 @Basic表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的getXxxx()方法,默认 即为 @Ba ...

  8. ORM,DAO,MVC,POJO

    1.ORM 对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间 ...

  9. 杂项-ORM:LinqToSQL

    ylbtech-杂项-ORM:LinqToSQL LINQ TO SQL 是包含在.NET Framework 3.5 版中的一种 O/RM 组件(对象关系映射),O/RM 允许你使用 .NET 的类 ...

随机推荐

  1. ARM平台的虚拟化介绍

    本篇博文主要介绍虚拟化的基本思想以及在arm平台如何做虚拟化,arm提供的硬件feature等等. 虚拟化技术简介 虚拟化技术 虚拟化是一个概念,单从这个概念的角度来看,只要是用某一种物品去模拟另一种 ...

  2. Spring Boot 整合 Mybatis Annotation 注解的完整 Web 案例

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 公司需要人.产品.业务和方向,方向又要人.产品.业务和方向,方向… 循环』 本文提纲一. ...

  3. 微信企业号JS-SDK选择图片、上传图片

    因公司项目需要,要修改一个手机端上传图片的一个功能,原本的项目用的是input 的file控件上传的,虽然标注了可以多选,但是在实际运用当中只有iOS手机可以实现多选,Android手机并不支持多选, ...

  4. JAVA多线程与并发学习总结

    1.      计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...

  5. linux 集群及lvs

    集群及LVS 集群: 一组通过高速网络互联的计算机组,并以单一系统的模式加以管理 价格很多服务器集中起来,提供同一种服务,在客户端看起来就像只有一个服务器 可以在付出较低成本的情况下获得在性能,可靠性 ...

  6. linux pxe网络装机无人值守

    项目分析远程装机的实现:配置DHCP+HTTP+TFTP提供通过vesamenu.c32模块实现图形PXE菜单为不同系统分别提供ks应答文件将第三方rpm包以yum源的方式提供:集中提供ntfs-3g ...

  7. Node.js模块导出module.exports 和 exports,Es6模块导出export 和export default的区别

    1.module.exports  module变量代表当前模块.这个变量是一个对象,module对象会创建一个叫exports的属性,这个属性的默认值是一个空的对象: module.exports ...

  8. Android动态改变App在Launcher里面的icon

    如果呆萌的产品童鞋让你动态更换App在Launcher里面的Icon,你怎么回答他,下文就提出一种实现该效果的方法. 原理1--activity-alias 在AndroidMainifest中,有两 ...

  9. python3.4 UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position

    python3.4 UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 实用python的时候 打开一个csv的文件出 ...

  10. PHP常见错误

    1.关于单引号和双引号的区别. $sql="insert into tableName values ('".$name."','".$email." ...