ORM

定义:

       ORM事Object  Relational Mapping,即对象关系映射。实质是将关系数据库重的业务数据用对象的形式表示出来,并且通过面向对象的方式将这些对象组织起来,最终在应用程序中创建一个虚拟’对象数据库‘。

优点:

  • 隐藏数据库实现,让业务代码访问对象而不是数据库表。
  • orm提供良好的数据库操作接口,简单学习成本低。
  • 动态数据表映射,在表结构甚至数据库改变时,减少代码修改量。
  • 可以方便的引入缓存功能。

SQLAlchemy ORM的架构解析:

1、使用者通过ORM对象提交命令
2、将命令交给SQLAlchemy Core(Schema/Types  SQL Expression Language)转换成SQL
3、使用 Engine/ConnectionPooling/Dialect 进行数据库操作
   3.1、匹配使用者事先配置好的egine
   3.2、egine从连接池中取出一个链接
   3.3、基于该链接通过Dialect调用DB API,将SQL转交给它去执行

SQLAlchemy ORM详解:

1:建立连接以及创建表策略


from sqlalchemy import create_engine

egine=create_engine('mysql+pymysql://root@127.0.0.1/db1?charset=utf8')

Base=declarative_base()

#创建单表:业务线
class Business(Base):
    __tablename__='business'
    id=Column(Integer,primary_key=True,autoincrement=True)
    bname=Column(String(32),nullable=False,index=True)

Base.metadata.create_all(egine)

 

2:插入和查询数据

from sqlalchemy.orm import sessionmaker
row_obj=Dep(dname='销售') #按关键字传参,无需指定id,因其是自增长的,Dep是个定义好的类
#增加
session.add(row_obj)
session.add_all([
    Dep(dname='技术'),
    Dep(dname='运营'),
    Dep(dname='人事'),
])

session.commit()
#删除
session.query(Dep).filter(Dep.id > 3).delete()
session.commit()
#修改
session.query(Dep).filter(Dep.id > 0).update({'dname':'哇哈哈'})
session.query(Dep).filter(Dep.id > 0).update({'dname':Dep.dname+'_SB'},synchronize_session=False)
session.query(Dep).filter(Dep.id > 0).update({'id':Dep.id*100},synchronize_session='evaluate')

session.commit()

#查所有,取所有字段
res=session.query(Dep).all() #for row in res:print(row.id,row.dname)

#查所有,取指定字段
res=session.query(Dep.dname).order_by(Dep.id).all() #for row in res:print(row.dname)

res=session.query(Dep.dname).first()
print(res) # ('哇哈哈_SB',)

#过滤查
res=session.query(Dep).filter(Dep.id > 1,Dep.id <1000) #逗号分隔,默认为and
print([(row.id,row.dname) for row in res])

SQLAlchemy Core详解

1:建立创建连接以及创建表策略

#coding=utf-8

from datetime import datetime
from sqlalchemy import (MetaData, Table, Column, Integer, Numeric, String, Boolean, 
                        DateTime, ForeignKey, ForeignKey, create_engine)

metadata = MetaData()

cookies = Table('cookies', metadata,
                Column('cookie_id', Integer(), primary_key=True),
                Column('cookie_name', String(50), index=True),
                Column('cookie_recipe_url', String(255)),
                Column('cookie_sku', String(55)),
                Column('quantity', Integer()),
                Column('unit_cost', Numeric(12, 2))
                )

users = Table('users', metadata,
              Column('user_id', Integer(), primary_key=True),
              Column('username', String(15), nullable=False, unique=True),
              Column('email_address', String(255), nullable=False),
              Column('phone', String(20), nullable=False),
              Column('password' ,String(25), nullable=False),
              Column('created_on', DateTime(), default=datetime.now),
              Column('updated_on', DateTime(), default=datetime.now, onupdate=datetime.now)
              )



engine = create_engine('mysql+pymysql://user:password@1.2.7.9:3306/cookies')
metadata.create_all(engine)

2:插入和查询数据

# 方式一
ins = users.insert().values(name=‘jack‘, fullname=‘Jack Jones‘)
conn.execute(ins)

# 方式二
conn.execute(users.insert(), id=2, name=‘wendy‘, fullname=‘Wendy Williams‘)

# 方式三
conn.execute(addresses.insert(), [
    {‘user_id‘: 1, ‘email_address‘ : ‘jack@yahoo.com‘},
    {‘user_id‘: 1, ‘email_address‘ : ‘jack@msn.com‘},
    {‘user_id‘: 2, ‘email_address‘ : ‘www@www.org‘},
    {‘user_id‘: 2, ‘email_address‘ : ‘wendy@aol.com‘},
 ])
from sqlalchemy.sql import select

for row in conn.execute(select([users])):
    print("name:", row[users.c.name], "; fullname:", row[users.c.fullname])

for row in conn.execute(select([users, addresses])):
    print(row)

for row in conn.execute(select([users, addresses]).where(users.c.id == addresses.c.user_id)):
    print(row)


from sqlalchemy.sql import and_, or_, not_
s = select([(users.c.fullname +
              ", " + addresses.c.email_address).
               label(‘title‘)]).       where(
          and_(
              users.c.id == addresses.c.user_id,
              users.c.name.between(‘m‘, ‘z‘),
              or_(
                 addresses.c.email_address.like(‘%@aol.com‘),
                 addresses.c.email_address.like(‘%@msn.com‘)
              )
          )
       )
conn.execute(s).fetchall()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值