【SQLAlchemy】python最常用ORM (一)

http://www.kardel.xyz/blog/sqlalchemypython-orm/

对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的–“虚拟对象数据库”。

SQLAlchemy首次发行于2006年2月,并迅速地在Python社区中最广泛使用的ORM工具之一。SQLAlchemy“采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”。SQLAlchemy的理念是,SQL数据库的量级和性能重要于对象集合;而对象集合的抽象又重要于表和行。因此,SQLAlchemy采用了类似于Java里Hibernate的数据映射模型,而不是其他ORM框架采用的Active Record模型。不过,Elixir和declarative等可选插件可以让用户使用声明语法。

建立连接

from sqlalchemy import create_engine
connect_args = {'check_same_thread': False}
engine = create_engine(engine, echo=False, connect_args=connect_args)

connect_args: 连接参数
echo: 是否在控制台打印sql,我们也可以将自定义的log设置给sqlalchemy,使echo为True时,将sql打印到项目日志中,后面的文章示例中体现。
engine: 为你要连接的命令字符串,如’sqlite:///:memory:’

create_engine返回一个Engine对象,当第一次如Engine.execute()或者Engine.connect()的方法被调用时,Engine才会真正的建立起到数据库的DBAPI连接。实际上,我们一般并不会直接使用Engine。

建立映射关系

当我们使用ORM的时候,其配置过程主要分为两个部分:一是描述我们要处理的数据库表的信息,二是将我们的Python类映射到这些表上。这两个过程在SQLAlchemy中是一起完成的,我们将这个过程称之为Declarative。

#! /usr/bin/env python

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String

BaseModel = declarative_base()


class User(BaseModel):
	__tablename__ = 'users'

	id = Column(Integer, primary_key=True)
	name = Column(String)
	password = Column(String)

	def __repr__(self):
		return "<User(name='%s', password='%s')>" % (
							self.name, self.password)

我们分析以上代码

第九行,通过declarative_base()方法得到一个BaseModel,我们自定义的映射关系将全部继承这个列
十三行,定义了表名,十五到十七行,定义了字段,相关类型请查询官方文档。
十九行,重写了__repr__方法

以上,我们完成了一个users表的映射关系定义,它有三个字段,id(主键),name和password,然后我们要如何创建这张表到数据库呢?

创建删除表:

当我们完成model类声明时,Declarative用一个Python的metaclass来为这个类进行了加工。在这个阶段,它依据我们给出的设置创建了Table对象,然后构造一个Mapper对象来与之关联。这些幕后的对象我们大多都不需要直接与之打交道。
当我们使用Declarative时,其table对象也可以在Declarative base class的.metadata属性中看到。

我们将使用MetaData来发出CREATE TABLE的命令

create_all()

BaseModel.metadata.create_all(engine)

比如:

model = User()
model.metadata.create_all(engine)

将创建一张user表

同样的,我们可以使用drop_all()来删除这张表

比如:

model = User()
model.metadata.drop_all(engine)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值