python中sqlalchemy模块的使用一

本篇博客主要是写一下如何使用Python的orm框架sqlalchemy如何对数据库进行增删改查的操作,本篇先做个引子,写一点简单的增删改查,接下来会把sqlalchemy如何进行复杂代码如何操作的写出来

什么是ORM?

对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,例如像java系列的hibernate, mybatis,JPA, python中的django(本人在学习python的初级阶段,目前只了解了一些django框架),简单来说,orm框架主要是为了把一个对象和数据库中的表进行映射,我们通过操作对象来操作数据库,通过查询数据库来获取对象,对对象进行操作,简单方便(会java的对此肯定深有体会),在python中有pymysql使用游标,使用sql对数据库进行操作,java中使用的是最基础的jdbc,有时间本人会对pymysql和sqlalchemy对数据库的操作做一个对比

简单说一下概念,下面我们写代码示例来讲解一些简单的方法吧

想要使用sqlalchemy我们必须要先安装,简单点:pip install sqlalchemy即可

第一步:创建映射对象

首先准备一个对象,用来和数据库表进行映射,此处用User表,其中有 id(整数,自增长,主键), name(姓名),age(年龄)

from sqlalchemy import Column,create_engine
from sqlalchemy.types import *
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

#创建对象的基类:
BaseModel = declarative_base()

#定义对象
class User(BaseModel):
    #表名
    __tablename__='user'
    id = Column('id',Integer,primary_key=True,autoincrement=True)
    name = Column("user_name",String(20))#数据库中的字段名称为:user_name
    age = Column('age', Integer)
    #方便输出,我们打印user时调用此方法
    def __repr__(self):
        return "id:%d,name:%s,age:%d" % (self.id, self.name, self.age)

第二步:连接数据库

sql_connect = "mysql://username:password@127.0.0.1/blogdb?charset=utf8"
#创建连接数据库引擎
engine = create_engine(sql_connect, echo=True)#echo参数设为true,是为了输出sql语句以及打印日志信息

第三步:定义数据库表的初始化与删除

#初始化数据库
def init_db():
    BaseModel.metadata.create_all(engine)

#删除数据库表
def drop_db():
    BaseModel.metadata.drop_all(engine)

个人初步学习中遇到了点麻烦:比如BaseModel.metadata这个之后create_all和drop_all方法不知道从哪来的,不过后来看了一下源码就知道了。。大家可以去看一下,有问题可以随时交流(也有可能本人水平较低)

我们调用init_db()之后数据库中就出现了user表,我看也可以看到打印创建表的日志:

CREATE TABLE user (
id INTEGER NOT NULL AUTO_INCREMENT, 
user_name VARCHAR(20), 
age INTEGER, 
PRIMARY KEY (id)

)

OK,初始化表之后,我们可以对表进行操作了,下面就开始进行增删改查操作吧:

示例一:增加数据:

DBsession = sessionmaker(bind=engine)
#添加数据
def addUser():
    # 创建session对象,相当于MySQLdb里面的游标
    session = DBsession()
    # 创建新User对象:
    new_user1 = User(name='zhangsan', age=18)
    new_user2 = User(name='lisi', age=12)
    # 添加到session:
    session.add(new_user1)
    session.add(new_user2)
    # 提交即保存到数据库
    session.commit()
    # 关闭session
    session.close()
addUser()

查看日志:

2018-04-20 16:37:34,081 INFO sqlalchemy.engine.base.Engine INSERT INTO user (user_name, age) VALUES (%s, %s)
2018-04-20 16:37:34,081 INFO sqlalchemy.engine.base.Engine ('zhangsan', 18)
2018-04-20 16:37:34,091 INFO sqlalchemy.engine.base.Engine INSERT INTO user (user_name, age) VALUES (%s, %s)
2018-04-20 16:37:34,092 INFO sqlalchemy.engine.base.Engine ('lisi', 12)

2018-04-20 16:37:34,102 INFO sqlalchemy.engine.base.Engine COMMIT

检查数据库:


实例二:查询数据

1、查询全部数据

def queryAll():
    # 调用all()则返回所有行:
    session = DBsession()
    users = session.query(User).all()
    print([user for user in users])
    session.close()

queryAll()

sql语句:

SELECT user.user_name AS user_user_name, user.id AS user_id, user.age AS user_age 

FROM user

结果:

[id:1,name:zhangsan,age:18, id:2,name:lisi,age:12]

2、查询部分数据,使用filter和filter_by:

#使用filter()则必须用 对象.属性==值;如果使用filter_by(),则使用"="即可
def queryFilter():
    session = DBsession()
    # 创建Query查询,filterwhere条件,最后调用one()返回唯一行
    # user = session.query(User).filter(User.id==1).one()
    user = session.query(User).filter_by(id=1).one()
    print(user)
    session.close()
queryFilter()
打印sql语句:SELECT user.user_name AS user_user_name, user.id AS user_id, user.age AS user_age 
FROM user 

WHERE user.id = %s

结果:

id:1,name:zhangsan,age:18

三:更新数据:

#更新数据
def update_method1():
    session = DBsession()
    user = session.query(User).filter(User.id == '1')
    user.update({User.age: 10, User.name:'aaaa'})
    session.commit()
    # 关闭session
    session.close()

update_method1()


def update_method2():
    session = DBsession()
    user = session.query(User).filter_by(id='2').one()
    user.age = 10
    user.name='bbb'
    session.commit()
    # 关闭session
    session.close()

update_method2()

打印sql语句:

UPDATE user SET user_name=%s, age=%s WHERE user.id = %s

数据库数据:


第二个方法多执行了一次查询,然后再次更新的,由此可见第一个方法效率更高

4、删除数据:

def delete():
    session = DBsession()
    user = session.query(User).filter(User.id == '1').one()
    session.delete(user)
    session.commit()
    # 关闭session
    session.close()
delete()

也是先执行查询,然后删除,查看打印日志打印了两条sql,第一个查询,第二个删除,这种方式删除不是很好


5、使用execute来执行查询

def execute():
    session = DBsession()
    user = session.execute("SELECT id,user_name as name,age FROM user WHERE id=:param",{"param":2}).fetchone()
    print(user)
    session.commit()
    # 关闭session
    session.close()
execute()
结果输出:(2, 'bbb', 10)

实际在我们操作过程中或许会需要很复杂的查询,比如关联查询、分组、聚合函数等操作,下一步我会继续写我们如何操作复杂的查询的,


努力成就非凡,请不要在最该奋斗的年纪选择安逸

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页
评论

打赏作者

badly1226

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值