python成长之路13

一:SqlAlchemy ORM  

ORM:Object Relational Mapping 对象关系映射是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换

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

建立在SQL AQI至上,不需要写原生SQL语句,是将对象封装并转成原生语句

Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:

MySQL-Python  #适用于python 2使用MySQL-python模块
    mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>

pymysql #适用于python 3,因为python 3里面的mysql模块变为pymysql
    mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]

MySQL-Connector #使用mysql connector连接数据库
    mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>

cx_Oracle #连接到oracle数据库
    oracle+cx_oracle://user:[email protected]:port/dbname[?key=value&key=value...]

更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html

1、使用 sqlalchemy + pymysql创建表:

import pymysql
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey
metadata = MetaData()
#创建user和color两个表,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:[email protected]@localhost:3306/test", max_overflow=5) #连接到数据库,最大连接池5个
metadata.create_all(engine) #创建数据库

2、增加数据:

import pymysql
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:[email protected]@localhost:3306/test", max_overflow=5)
conn = engine.connect()
sql = user.insert().values(id=1,name=‘wu‘) #id可以不写,会自增
conn.execute(sql)
conn.close()

数据库验证:

3、删除数据:

#/usr/bin/env  python
# -*- coding:utf-8 -*-

import pymysql
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:[email protected]@localhost:3306/test", max_overflow=5)
conn = engine.connect()

sql1 = user.delete().where(user.c.id == 1) #匹配id为1
sql2 = user.delete().where(user.c.name == ‘li‘) #匹配条件name为li
conn.execute(sql1) #执行语句
conn.execute(sql2)
conn.close()

4、改数据:

import pymysql
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:[email protected]@localhost:3306/test", max_overflow=5)
conn = engine.connect()

#sql1 = user.insert().values(name="zhang") #添加数据
sql1 = user.update().where(user.c.name == ‘zhang‘).values(name=‘jack‘) #匹配套件并改数据
conn.execute(sql1)
conn.close()

5、查数据:

#/usr/bin/env  python
# -*- coding:utf-8 -*-

import pymysql
from sqlalchemy import create_engine, select,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:[email protected]@localhost:3306/test", max_overflow=5)
conn = engine.connect()
sql = select([user,])
res = conn.execute(sql)
print(res.fetchall())
conn.close()

实际使用方法介绍:

创建表并插入数据:

#/usr/bin/env  python
# -*- coding:utf-8 -*-

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+pymysql://root:[email protected]@localhost:3306/test",echo=True)

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=‘Centos‘,ip_addr=‘192.168.10.254‘,port=2021)
    session.add_all([h1,h2])
    session.commit() #提交

查询并更改数据:

#/usr/bin/env  python
# -*- coding:utf-8 -*-

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+pymysql://root:[email protected]@localhost:3306/test",echo=True)

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=‘Centos‘,ip_addr=‘192.168.10.254‘,port=2021)
    session.add_all([h1,h2])

    #session.rollback()
    #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‘])).first() #all所有,first第一个,last最后一个

    #res.hostname = "test hostname" #将查到的数据改值
    session.delete(res) #删除查询到的数据
    session.commit() #提交

ORM 外键关联多对多: 一个组可以包含多个主机,一个主机也可以在多个组,即一个主机可以在多个组里面,如下:

class Parent(Base):  #父类
    __tablename__ = ‘parent‘
    id = Column(Integer, primary_key=True)
    children = relationship("Child")

class Child(Base):  #子类
    __tablename__ = ‘child‘  #定义表名称
    id = Column(Integer, primary_key=True)  #id的值类型
    parent_id = Column(Integer, ForeignKey(‘parent.id‘))  #关联父类的‘parent.id即可完成与父类的外键关联

测试;

sqlalchemy无法在已经存在的表里面增加新的字段,因此可以将表删除重新创建,或自己使用原生SQL语句创建,也可以使用sqlalchemy的三方工具,我们这里将以前的表删除再重建:

mysql> drop tables  hosts;
Query OK, 0 rows affected (0.22 sec)

Pyhton 代码:

#/usr/bin/env  python
# -*- coding:utf-8 -*-

from sqlalchemy import create_engine,ForeignKey
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+pymysql://root:[email protected]@localhost:3306/test",echo=True)

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)
    group_id = Column(Integer, ForeignKey(‘group.id‘))

class Group(Base):
    __tablename__ = ‘group‘
    id = Column(Integer,primary_key=True)
    name = Column(String(64),unique=True,nullable=False)
    child_id = Column(Integer)
Base.metadata.create_all(engine) #创建所有表结构

if __name__ == ‘__main__‘:
    SessionCls = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
    session = SessionCls()
    session.commit() #提交

验证:

mysql> desc hosts;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| hostname | varchar(64)  | NO   | UNI | NULL    |                |
| ip_addr  | varchar(128) | NO   | UNI | NULL    |                |
| port     | int(11)      | YES  |     | NULL    |                |
| group_id | int(11)      | YES  | MUL | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
5 rows in set (0.01 sec) #group_id 行的Key的值是Mul

查看group表:

mysql> desc test.group;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| name     | varchar(64) | NO   | UNI | NULL    |                |
| child_id | int(11)     | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

创建关联的数据:

#/usr/bin/env  python
# -*- coding:utf-8 -*-

from sqlalchemy import create_engine,ForeignKey
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+pymysql://root:[email protected]@localhost:3306/test",echo=True)

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)
    group_id = Column(Integer, ForeignKey(‘group.id‘))

class Group(Base):
    __tablename__ = ‘group‘
    id = Column(Integer,primary_key=True)
    name = Column(String(64),unique=True,nullable=False)
    child_id = Column(Integer)

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

if __name__ == ‘__main__‘:
    SessionCls = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
    session = SessionCls()

    g3 = Group(name=‘g3‘)
    session.add_all([g3,])
    h1 = Host(hostname=‘localhost‘,ip_addr=‘1.1.1.1‘,group_id=g3.id) #由于数据库还没有g3的内容,所以这样关联不成功
    session.add_all([h1,])
    session.commit() #提交

更改关联数据:

#/usr/bin/env  python
# -*- coding:utf-8 -*-

from sqlalchemy import create_engine,ForeignKey
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+pymysql://root:[email protected]@localhost:3306/test",echo=True)

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)
    group_id = Column(Integer, ForeignKey(‘group.id‘))

class Group(Base):
    __tablename__ = ‘group‘
    id = Column(Integer,primary_key=True)
    name = Column(String(64),unique=True,nullable=False)
    child_id = Column(Integer)

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

if __name__ == ‘__main__‘:
    SessionCls = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
    session = SessionCls()
    g3 = session.query(Group).filter(Group.name==‘g3‘).first()  #查到一个已经存在的组
    h = session.query(Host).filter(Host.hostname==‘localhost‘).update({‘group_id‘: g3.id}) #查到一个主机的信息并更新其group_id为上一步查到的组的id,即完成了外键的管理
    session.commit() #提交

时间: 2024-10-11 17:38:12

python成长之路13的相关文章

python成长之路第三篇(1)_初识函数

目录: 函数 1.为什么要使用函数 2.什么是函数 3.函数的返回值 4.文档化函数 5.函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多代码是重复利用的,这样会使我们的代码变得异常臃肿,比如说: 我们要写一个验证码的功能 例子: 比如说我们要进行一些操作,而这些操作需要填写验证码 验证码代码:  1 import random   2 number_check = ''   3 for i in range(0,

我的Python成长之路---第一天---Python基础(1)---2015年12月26日(雾霾)

2015年12月26日是个特别的日子,我的Python成之路迈出第一步.见到了心目中的Python大神(Alex),也认识到了新的志向相投的伙伴,非常开心. 尽管之前看过一些Python的视频.书,算是有一点基础.但在这里我要保持空杯心态,一切从头开始.好了不多说,Let's Python!!!! 一.Python简介 Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言.目前Python已经成为实际上除了中国最流行的开发语

我的Python成长之路---第三天---Python基础(13)---2016年1月16日(雾霾)

五.Python的常用的内置函数 Python为我们准备了大量的内置函数,如下图所示 这里我们只讨论红框内的内置函数 abs(x) 返回一个数的绝对值(模),参数可以是真说或浮点数 >>> abs(-10) 10 all(iterable) 如果可迭代对象(列表.元祖等)中所有的元素都是True,则返回True,否则返回False.相当于and >>> all([1, True, 1 == 1]) True any(iterable) 如果可迭代对象中任意一个元素是Tr

Python成长之路第二篇(1)_数据类型内置函数用法

数据类型内置函数用法int 关于内置方法是非常的多这里呢做了一下总结 (1)__abs__(...)返回x的绝对值 #返回x的绝对值!!!都是双下划线 x.__abs__() <==> abs(x) 例如: #!/usr/bin/python print "abs(-45) : ", abs(-45) print "abs(100.12) : ", abs(100.12) print "abs(119L) : ", abs(119L)

python成长之路第三篇(2)_正则表达式

打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.什么是正则表达式,python中得正则简介 2.re模块的内容 3.小练习 一.什么是正则表达式(re) 正则表达式相信很多人都熟悉了,在python中正则表达式的支持是通过re(regular expression)模块,正则表达式是可以匹配文本片段的模式,简单的是正则表达式就是普通的字符串,可以处理字符串.也就是说正则表达式的存在就是来处理文本字符串的 下面来熟悉下正则中的几个概念: 1.通配符 通配符是

python成长之路第三篇(4)_作用域,递归,模块,内置模块(os,ConfigParser,hashlib),with文件操作

打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.作用域 2.递归 3.模块介绍 4.内置模块-OS 5.内置模块-ConfigParser 6.内置模块-hashlib 7.with文件操作 代码执行环境默认为3.5.1 一.作用域 (1)什么是作用域,官方来说作用域就是就是有不同的命名空间,就像下面的代码一样,a=1它的作用域是全局的,也在全局的命名空间当中,当函数 action中的a=2它就在局部的作用域中,也在局部的命名空间当中. a = 1def

Python成长之路_装饰器

一.初入装饰器 1.首先呢我们有这么一段代码,这段代码假如是N个业务部门的函数 1 def f1(aaa): 2 print('我是F1业务') 3 if aaa == 'f1': 4 return 'ok' 5 6 def f2(aaa): 7 print('我是F2业务') 8 if aaa == 'f2': 9 return 'ok' 业务代码 这里呢也就是当我们调用上面的函数的时候,传入值给aaa,当aaa的值等于f1或者f2就返回ok 2.公司有N个业务部门,1个基础平台部门,基础平台

python成长之路第一篇(5)文件的基本操作

一.三元运算 我们在上章学习的if,,else,,有一种简便的方法 他的表达式是这样的:变量 = 值1 if 条件 else 值2 解释过来就是如果aaa等于sss则输出值1否则输出值2 二.类的概念 类是面向对象编程的核心, 它扮演相关数据及逻辑的容器角色.它们提供了创建"真实"        对象(也就是实例)的蓝图.对于Python,一切事物都是对象,对象基于类创建. 如何查询对象的类呢? 为啥分为有下划线和没下划线的呢,这些又是什么呢?本例中以查看的是列表的类,那么这个类下面就

python成长之路9——文件操作open

一. 打开文件 f = open("db","r",encoding="utf8") r:只读 w:只写,会先清空文件 a:追加 x:如果文件存在,则报错,否则,创建文件并只写 b:上面的参数都可以加"b",意思是以二进制形式打开文件,读取写入的都是字节,就不需要考虑"encoding"啦 encoding="utf8":告诉python解释器用utf8进行转码,当我们读取字符串时解释器