【python】SQLAlchemy(一)

ORM

ORM(Object Rational Mapping),对象关系映射。用于把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。操作对象的属性就等于操作数据库中的记录。


ORM优点

 

a)         清楚直观,避免直接写SQL

b)         可以轻松写出复杂的查询(还好看

c)         可移植性强


py2和py3

 由于py3已经不支持mysqldb这个模块了,可用PyMySql代替。

连接数据库的链接也由

'mysql+mysqlconnector://root:root@localhost:3306/test'变为
   'mysql+pymysql://root:root@localhost:3306/test'

基本操作

a)         创建并连接引擎

#-*- coding:UTF-8 -*-
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine_url = 'mysql+mysqlconnector://root:root@localhost:3306/test' #数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名 

engine_ = created_engine(engine_url, encoding='utf-8', echo=True) #echo 打印过程
Session_class = sessionmaker(engine_) #创建一个session工厂
Session = Session_class() #创建一个session类

b)         数据操作

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import  Column, Integer, String
Base = declarative_base() #sqlalchemy基础类

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

    def __repr__(self):
        res = ""{{id:{id},name:{name},pwd:{pwd}}}"".format(id=self.id, name=self.name, pwd= self.password)
        return res

#create table
Base.metadata.create_all(engine_) 

#insert
user1 = User(name="LiMing", password="hahahah")
user2 = User(name="HanMeiMei", password="ohuohuo")
Session.add(user1)
Session.add(user2)

#select
data = Session.query(User).filter(User.id<3).all()
print(data)#返回的data是class,如果是多条数据则返回list,记录的值在相应的属性里;
#如果不选择查找属性(all/one/first)则data为解析的sql语句
#update data[0].name = "New" data[0].password = "New pwd" Session.commit() #delete Session.delete(data[1]) # *提交以上所有操作 Session.commit()

d)         提交操作

 

Session.commit()

 

 relationship

relationship用于定义表与表的关系。

比如有用户表user、文章表article。文章是某个用户写的,一个用户可拥有多个文章。这是一对多关系。

class User(BASE):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    username = Column(String(64), nullable=False, index=True)
    password = Column(String(64), nullable=False)
    email = Column(String(64), nullable=False, index=True)
    articles = relationship('Article', backref='author')   # 文章和用户的关系链接
   

    使用backref就不用在Article里面再反向relationship user了

    relationship有一个很常用的参数lazy。默认值为'select',可选还有‘dynamic’(只能在一对多和多对多中使用)、joined(联结操作)。区别之后单说


 

批量插入

 

data = []
from random import randint,choice
#method1 ORM
for i in range(10):
    one = Student(
        class_id = randint(1,4),
        name = 'Student'+str(i+1),
        sex = choice([0,1]),
        age = randint(9,13)
    )
    data.append(one)

Session.add_all(data)
Session.commit()

 

#method2 非ORM 快一些
for i in range(10,20):
    data.append(
        {'class_id':'randint(1,4)', 'name':'Student'+str(i+1), 'sex':choice([0,1]), 'age' : randint(9,13)}
    )

Session.execute(Student.__table__.insert(), data)
Session.commit()

 

 

 

 

 

转载于:https://www.cnblogs.com/Hed-geh0g/p/8336757.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值