我是靠谱客的博主 结实老师,最近开发中收集的这篇文章主要介绍python sqlalchemy原理_一个初学者的辛酸路程-python操作SQLAlchemy-13,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言

其实一开始写blog,我是拒绝的,但是,没办法,没有任何理由抗拒。今天呢,要说的就是如何使用Python来操作数据库。

SQLAlchemy

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

以前我们常用pymysql来操作数据库,举个栗子

(需要提前安装上pymysql)

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# Author: Leon xie

import pymysql

#创建连接

conn = pymysql.connect(host='192.168.56.11',port=3306,user='root',passwd='root',db='oldboydb')

#创建游标 socket上建立的实例

cursor=conn.cursor()

#执行SQL,并返回行数,用游标执行,

effect_row = cursor.execute("select * from student")

# print(cursor.fetchone())

# print(cursor.fetchone())

print(cursor.fetchall())

这样就可以把数据全部取出来。

插入数据呢?

#!/usr/bin/env python

#-*- coding:utf-8 -*-# Author: Leon xie

import pymysql

#创建连接

conn= pymysql.connect(host='192.168.56.11',port=3306,user='root',passwd='root',db='oldboydb')

#创建游标 socket上建立的实例

cursor=conn.cursor()

#执行SQL,并返回行数,用游标执行,

#effect_row= cursor.execute("select * from student")

# print(cursor.fetchone())

# print(cursor.fetchone())

# print(cursor.fetchall())

data=[

("N1","2015-05-22",'M'),

("N2","2015-05-22",'M'),

("N3","2015-05-22",'M'),

("N4","2015-05-22",'M'),

]

cursor.executemany("insert into student (name,register_date,gender) values(%s,%s,%s)",data )

conn.commit()

有个问题,上面需要我写原生的SQL语句来使用。如果写原生,自己增删改,如果简单还行,复杂就很麻烦了,重用性不强,因为都是写死在里面,如果数据库结果变化就的改,对扩展什么都不方便,包括

SQL水平也就一般般,很多情况写不出高效的SQL语句,涉及到软件好慢好慢,加机器都不好使。

为了避免,我们把原生SQL写死到源代码里,怎么办呢?就要引入下面的东西。

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

这样,就不用写原生的SQL了。

所以我们引入了ORM,什么是ORM?

ORM就是对象映射关系程序。相当于ORM帮我们把对象里的转化成SQL然后跟数据库交互

ORM的优点:

1、隐藏了数据访问细节,封闭的通用数据库交互,ORM的核心,它使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。

2、ORM使我们构造固化数据结构变得简单易行。

缺点:

1、无可避免,自动化意味着映射和关联管理,代价是牺牲性能

ORM是一个术语,不是一个软件,基于ORM的标准下,有很多软件,最执行的就是SQLAlchemy ,(SQL 阿哥迷)

如何使用?

windows下安装

pip install sqlalchemy

接下来利用ORM实现一个创建表的功能

#!/usr/bin/env python

#-*- coding:utf-8 -*-# Author: Leon xie

import sqlalchemyfromsqlalchemy import create_enginefromsqlalchemy.ext.declarative import declarative_basefromsqlalchemy import Column,Integer,String

engine= create_engine("mysql+pymysql://root:root@192.168.56.11/oldboydb",encoding='utf-8',echo=True)

#echo=True,就是把整个过程打印出来

Base=declarative_base() #生成ORM基类classUser(Base):

__tablename__= 'user'#表名

id= Column(Integer,primary_key=True) #字段,整形,主键 column是导入的

name= Column(String(32))

password= Column(String(64))

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

实现结果,就是在数据库创建了一个表,user,再次执行,如果数据库有,它就不会创建了。

插入数据

'''创建数据,有个游标的东西叫做sessionmaker需要单独导入'''#实例与socket绑定,创建与数据库的绘画sessionclass,注意,这里返回

#给session的是一个class,不是实例

Session_class= sessionmaker(bind=engine)

#生成session实例,cursor

Session=Session_class()

#生产你要创建的数据对象

xiedi_obj= User(name="alex",password="123")

xiedi_obj2= User(name="jack",password="123")

#目前还没有创建对象,可以打印看看,上面只是申明

print(xiedi_obj.name,xiedi_obj.id)

#把要创建的数据对象添加到这个session里,一会同一创建

Session.add(xiedi_obj)

Session.add(xiedi_obj2)

#这里依旧没有创建

print(xiedi_obj.name,xiedi_obj.id)

#现在才同一提交,创建数据

Session.commit()

查询

#!/usr/bin/env python

#-*- coding:utf-8 -*-# Author: Leon xie'''利用ORM实现一个创建表的功能'''import sqlalchemyfromsqlalchemy import create_enginefromsqlalchemy.ext.declarative import declarative_basefromsqlalchemy import Column,Integer,Stringfromsqlalchemy.orm import sessionmaker

#创建连接

engine= create_engine("mysql+pymysql://root:root@192.168.56.11/oldboydb",encoding='utf-8')

Base=declarative_base() #生成ORM基类

#创建表结构classUser(Base):

__tablename__= 'xiedi'#表名

id= Column(Integer,primary_key=True)

name= Column(String(32))

password= Column(String(64))

def __repr__(self):return "" %(self.id,self.name)

#直接调用基类下的方法,创建表结构

Base.metadata.create_all(engine)'''查看'''T1 = sessionmaker(bind=engine)

T2=T1()

#filter查出来的是一组数据,它不知道你要查多少

data=T2.query(User).filter_by().all()

print(data)

打印结果

[<1 name:alex>, <2 name:jack>]

修改,原理就是搜索出来,然后赋值

data = Session.query(User).filter(User.id>1).filter(User.id<4).first()

print(data)

data.name= "Jack Liu"data.password= "Shit happens"#提交

Session.commit()

统计

#!/usr/bin/env python

#-*- coding:utf-8 -*-# Author: Leon xie'''利用ORM实现一个创建表的功能'''import sqlalchemyfromsqlalchemy import create_enginefromsqlalchemy.ext.declarative import declarative_basefromsqlalchemy import Column,Integer,Stringfromsqlalchemy.orm import sessionmaker

#创建连接

engine= create_engine("mysql+pymysql://root:root@192.168.56.11/oldboydb",encoding='utf-8')

Base=declarative_base() #生成ORM基类

#创建表结构classUser(Base):

__tablename__= 'xiedi'#表名

id= Column(Integer,primary_key=True)

name= Column(String(32))

password= Column(String(64))

#直接调用基类下的方法

Base.metadata.create_all(engine)

#实例与socket绑定,创建与数据库的绘画sessionclass,注意,这里返回

#给session的是一个class,不是实例

Session_class= sessionmaker(bind=engine)

#生成session实例,cursor

Session=Session_class()

#创建用户

fake_user= User(name='rain',password="12345")

Session.add(fake_user)

print(Session.query(User).filter(User.name.in_(['xiedi','rain','jack'])).all())

Session.rollback()

print(Session.query(User).filter(User.name.in_(['xiedi','rain','jack'])).all())

print(Session.query(User).filter(User.name.in_(['Jack','rain'])).count())

打印结果1

那么如何取分组呢?统计每个名字出现多少次

#!/usr/bin/env python

#-*- coding:utf-8 -*-# Author: Leon xie'''利用ORM实现一个创建表的功能'''import sqlalchemyfromsqlalchemy import create_enginefromsqlalchemy.ext.declarative import declarative_basefromsqlalchemy import Column,Integer,Stringfromsqlalchemy.orm import sessionmaker

#创建连接

engine= create_engine("mysql+pymysql://root:root@192.168.56.11/oldboydb",encoding='utf-8')

Base=declarative_base() #生成ORM基类

#创建表结构classUser(Base):

__tablename__= 'xiedi'#表名

id= Column(Integer,primary_key=True)

name= Column(String(32))

password= Column(String(64))

#直接调用基类下的方法,创建表结构

Base.metadata.create_all(engine)'''创建数据,有个游标的东西叫做sessionmaker需要单独导入'''#实例与socket绑定,创建与数据库的绘画sessionclass,注意,这里返回

#给session的是一个class,不是实例

Session_class= sessionmaker(bind=engine)

#生成session实例,cursor

Session=Session_class()fromsqlalchemy import func

print(Session.query(User.name,func.count(User.name)).group_by(User.name).all())

打印结果

[('alex', 1, 'alex'), ('Jack Liu', 1, 'Jack Liu')]

外键关联

#!/usr/bin/env python

#-*- coding:utf-8 -*-# Author: Leon xie

import sqlalchemyfromsqlalchemy import create_enginefromsqlalchemy.ext.declarative import declarative_basefromsqlalchemy import Column,Integer,String,DATE,Enumfromsqlalchemy.orm import sessionmaker

engine= create_engine("mysql+pymysql://root:root@192.168.56.11/oldboydb",encoding='utf-8')

#echo=True,就是把整个过程打印出来

Base=declarative_base() #生成ORM基类classUser(Base):

__tablename__= 'user'#表名

id= Column(Integer,primary_key=True) #字段,整形,主键 column是导入的

name= Column(String(32))

password= Column(String(64))

def __repr__(self):return "" %(self.id,self.name)classStudent(Base):

__tablename__= 'student'#表名

id= Column(Integer,primary_key=True) #字段,整形,主键 column是导入的

name= Column(String(32),nullable=False)

register_date= Column(DATE,nullable=False)

gender= Column(String(32),nullable=False)

def __repr__(self):return "" %(self.id,self.name)

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

Session_class= sessionmaker(bind=engine)

Session=Session_class()

# s1= Student(name="s2",register_date="2015-03-01",gender="F")

# Session.add(s1)

print(Session.query(User,Student).filter(User.id==Student.id).all())

Session.commit()

最后

以上就是结实老师为你收集整理的python sqlalchemy原理_一个初学者的辛酸路程-python操作SQLAlchemy-13的全部内容,希望文章能够帮你解决python sqlalchemy原理_一个初学者的辛酸路程-python操作SQLAlchemy-13所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部