概述
本篇博客主要是写一下如何使用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查询,filter是where条件,最后调用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)
实际在我们操作过程中或许会需要很复杂的查询,比如关联查询、分组、聚合函数等操作,下一步我会继续写我们如何操作复杂的查询的,
努力成就非凡,请不要在最该奋斗的年纪选择安逸
最后
以上就是微笑热狗为你收集整理的python中sqlalchemy模块的使用一的全部内容,希望文章能够帮你解决python中sqlalchemy模块的使用一所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复