python数据库操作之pymysql模块和sqlalchemy模块(项目必备)
pymysql
?pymsql是Python中操作MySQL的模塊,其使用方法和MySQLdb幾乎相同。
1、下載安裝
pip3 install pymysql2、操作數(shù)據(jù)庫(kù)
(1)、執(zhí)行sql
#!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql# 創(chuàng)建連接 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1') # 創(chuàng)建游標(biāo) cursor = conn.cursor()# 執(zhí)行SQL,并返回收影響行數(shù) effect_row = cursor.execute("update hosts set host = '1.1.1.2'")# 執(zhí)行SQL,并返回受影響行數(shù) #effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))# 執(zhí)行SQL,并返回受影響行數(shù) #effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])# 提交,不然無(wú)法保存新建或者修改的數(shù)據(jù) conn.commit()# 關(guān)閉游標(biāo) cursor.close() # 關(guān)閉連接 conn.close()(2)、獲取新創(chuàng)建數(shù)據(jù)自增ID
#!/usr/bin/env python # -*- coding:utf-8 -*- import pymysqlconn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1') cursor = conn.cursor() cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)]) conn.commit() cursor.close() conn.close()# 獲取最新自增ID new_id = cursor.lastrowid(3)、獲取查詢(xún)數(shù)據(jù)
#!/usr/bin/env python # -*- coding:utf-8 -*- import pymysqlconn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1') cursor = conn.cursor() cursor.execute("select * from hosts")# 獲取第一行數(shù)據(jù) row_1 = cursor.fetchone()# 獲取前n行數(shù)據(jù) # row_2 = cursor.fetchmany(3) # 獲取所有數(shù)據(jù) # row_3 = cursor.fetchall()conn.commit() cursor.close() conn.close()注:在fetch數(shù)據(jù)時(shí)按照順序進(jìn)行,可以使用cursor.scroll(num,mode)來(lái)移動(dòng)游標(biāo)位置,如:
- cursor.scroll(1,mode='relative') ?# 相對(duì)當(dāng)前位置移動(dòng)
- cursor.scroll(2,mode='absolute') # 相對(duì)絕對(duì)位置移動(dòng)
(4)、fetch數(shù)據(jù)類(lèi)型
關(guān)于默認(rèn)獲取的數(shù)據(jù)是元祖類(lèi)型,如果想要或者字典類(lèi)型的數(shù)據(jù),即:
#!/usr/bin/env python # -*- coding:utf-8 -*- import pymysqlconn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')# 游標(biāo)設(shè)置為字典類(lèi)型 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) r = cursor.execute("call p1()")result = cursor.fetchone()conn.commit() cursor.close() conn.close()?
sqlalchemy簡(jiǎn)介
SQLAlchemy是Python編程語(yǔ)言下的一款開(kāi)源軟件。提供了SQL工具包及對(duì)象關(guān)系映射(ORM)工具,使用MIT許可證發(fā)行。
SQLAlchemy“采用簡(jiǎn)單的Python語(yǔ)言,為高效和高性能的數(shù)據(jù)庫(kù)訪問(wèn)設(shè)計(jì),實(shí)現(xiàn)了完整的企業(yè)級(jí)持久模型”。SQLAlchemy的理念是,SQL數(shù)據(jù)庫(kù)的量級(jí)和性能重要于對(duì)象集合;而對(duì)象集合的抽象又重要于表和行。因此,SQLAlchmey采用了類(lèi)似于Java里Hibernate的數(shù)據(jù)映射模型,而不是其他ORM框架采用的Active Record模型。不過(guò),Elixir和declarative等可選插件可以讓用戶(hù)使用聲明語(yǔ)法。
SQLAlchemy與數(shù)據(jù)庫(kù)關(guān)系圖如下:
sqlalchemy基本操作
一、安裝sqlalchemy
- 本文采用的是mysql案例,所以需要一臺(tái)有安裝mysql數(shù)據(jù)庫(kù)的機(jī)器
- 使用python的pip3安裝 pip3 install?sqlalchemy
安裝完后查看版本信息
import sqlalchemy sqlalchemy.__version__二、連接數(shù)據(jù)庫(kù)
在sqlalchemy中,session用于創(chuàng)建程序與數(shù)據(jù)庫(kù)之間的會(huì)話。所有對(duì)象的載入和保存都需要通過(guò)session對(duì)象。
from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker# 鏈接數(shù)據(jù)庫(kù)采用pymysq模塊做映射,后面參數(shù)是最大連接數(shù)5 ENGINE=create_engine("mysql+pymysql://root@127.0.0.1:3306/digchouti?charset=utf8", max_overflow=5) Session = sessionmaker(bind=engine)session = Session()三、創(chuàng)建映射(創(chuàng)建表)
一個(gè)映射對(duì)應(yīng)著一個(gè)Python類(lèi),用來(lái)表示一個(gè)表的結(jié)構(gòu)。下面創(chuàng)建一個(gè)person表,包括id和name兩個(gè)字段。也就是說(shuō)創(chuàng)建表就是用python的的類(lèi)來(lái)實(shí)現(xiàn)
import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String from sqlalchemy.orm import sessionmakerENGINE=create_engine("mysql+pymysql://root@127.0.0.1:3306/digchouti?charset=utf8", max_overflow=5)#生成一個(gè)SQLORM基類(lèi),創(chuàng)建表必須繼承他,別問(wèn)我啥意思就是這么規(guī)定的 Base = declarative_base()class Person(Base):__tablename__ = 'userinfo'id = Column(Integer, primary_key=True)name = Column(String(32))def __repr__(self):return "<Person(name='%s')>" % self.name此代碼是創(chuàng)建了一個(gè)名字叫userinfo的表,表里有兩列,一列是id,一列是name。
四、添加數(shù)據(jù)
當(dāng)然我們創(chuàng)建了表,肯定也要添加數(shù)據(jù),代碼如下:
#創(chuàng)建一個(gè)person對(duì)象 person = Person(name='張巖林') #添加person對(duì)象,但是仍然沒(méi)有提交到數(shù)據(jù)庫(kù) session.add(person) #提交數(shù)據(jù)庫(kù) session.commit()當(dāng)然還能添加多條數(shù)據(jù):
session.add_all([Person(name='張巖林'),Person(name='aylin') ]) session.commit()五、查找數(shù)據(jù)
在sqlalchemy模塊中,查找數(shù)據(jù)給提供了query()的方法 下面我就把能用到的給列舉一下:
#獲取所有數(shù)據(jù) session.query(Person).all()#獲取name=‘張巖林’的那行數(shù)據(jù) session.query(Person).filter(Person.name=='張巖林').one()#獲取返回?cái)?shù)據(jù)的第一行 session.query(Person).first()#查找id大于1的所有數(shù)據(jù) session.query(Person.name).filter(Person.id>1).all()#limit索引取出第一二行數(shù)據(jù) session.query(Person).all()[1:3]#order by,按照id從大到小排列 session.query(Person).ordre_by(Person.id)#equal/like/in query = session.query(Person) query.filter(Person.id==1).all() query.filter(Person.id!=1).all() query.filter(Person.name.like('%ay%')).all() query.filter(Person.id.in_([1,2,3])).all() query.filter(~Person.id.in_([1,2,3])).all() query.filter(Person.name==None).all()#and or from sqlalchemy import and_ from sqlalchemy import or_ query.filter(and_(Person.id==1, Person.name=='張巖林')).all() query.filter(Person.id==1, Person.name=='張巖林').all() query.filter(Person.id==1).filter(Person.name=='張巖林').all() query.filter(or_(Person.id==1, Person.id==2)).all()# count計(jì)算個(gè)數(shù) session.query(Person).count()# 修改update session.query(Person).filter(id > 2).update({'name' : '張巖林'}) # 通配符 ret = session.query(Users).filter(Users.name.like('e%')).all() ret = session.query(Users).filter(~Users.name.like('e%')).all()# 限制 ret = session.query(Users)[1:2]# 排序 ret = session.query(Users).order_by(Users.name.desc()).all() ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()# 分組 from sqlalchemy.sql import funcret = session.query(Users).group_by(Users.extra).all() ret = session.query(func.max(Users.id),func.sum(Users.id),func.min(Users.id)).group_by(Users.name).all()ret = session.query(func.max(Users.id),func.sum(Users.id),func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all()# 連表ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()ret = session.query(Person).join(Favor).all()ret = session.query(Person).join(Favor, isouter=True).all()# 組合 q1 = session.query(Users.name).filter(Users.id > 2) q2 = session.query(Favor.caption).filter(Favor.nid < 2) ret = q1.union(q2).all()q1 = session.query(Users.name).filter(Users.id > 2) q2 = session.query(Favor.caption).filter(Favor.nid < 2) ret = q1.union_all(q2).all()查詢(xún)這塊比較多,可能寫(xiě)的不全還望各位見(jiàn)諒,剩下我相信大家都能擴(kuò)展起來(lái)
上面的介紹完了,可能各位還不能吧融合到一塊去,下面我給大家融合寫(xiě)在一塊吧:
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column from sqlalchemy import Integer, String, TIMESTAMP from sqlalchemy import ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy import create_engineENGINE=create_engine("mysql+pymysql://root@127.0.0.1:3306/digchouti?charset=utf8", max_overflow=5)Base = declarative_base()class Person(Base):__tablename__ = 'userinfo'id = Column(Integer, primary_key=True)name = Column(String(32))def __repr__(self):return "<Person(name='%s')>" % self.name#創(chuàng)建連接數(shù)據(jù)庫(kù)以供提交用,至此表會(huì)創(chuàng)建完成,可以去數(shù)據(jù)庫(kù)里面查看 Base.metadata.create_all(ENGINE) Session = sessionmaker(bind=engine) # 往里面插入多條數(shù)據(jù) session = Session() session.add_all([Person(name='張巖林'),Person(name='很帥') ]) session.commit()sqlalchemy表關(guān)系之高級(jí)用法
上面闡述的是對(duì)于一張表的操作,下面將說(shuō)的是表關(guān)系的一對(duì)多,多對(duì)多,了解數(shù)據(jù)庫(kù)的都知道外鍵,也就是表關(guān)系建立。
1、一對(duì)多外鍵(1)
第一種方法我們只用到普通的操作,這個(gè)方式相對(duì)于好理解,在第一張表創(chuàng)建完,插入數(shù)據(jù)然后要記得提交數(shù)據(jù),然后往第二章表創(chuàng)建數(shù)據(jù)的時(shí)候,可以直接拿第一張相關(guān)聯(lián)的數(shù)據(jù),代碼如下:
#!/usr/bin/env python # -*- coding:utf-8 -*-from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,ForeignKey,UniqueConstraint,Index,String from sqlalchemy.orm import sessionmaker,relationship from sqlalchemy import create_engineengine=create_engine('mysql+pymysql://root@127.0.0.1:3306/db1')Base = declarative_base()class Son(Base):__tablename__ = 'son'id = Column(Integer,primary_key=True)name = Column(String(32))age = Column(String(32))# 創(chuàng)建外鍵,對(duì)應(yīng)父親那張表的id項(xiàng)father_id = Column(Integer,ForeignKey('father.id'))class Father(Base):__tablename__ = 'father'id = Column(Integer,primary_key=True)name = Column(String(32))age = Column(String(32))Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) session = Session()f1 = Father(name = 'zhangyanlin',age = '18') session.add(f1) session.commit()w1 = Son(name = 'xiaozhang1',age = 3,father_id = 1) w2 = Son(name = 'xiaozhang2',age = 3,father_id = 1)session.add_all([w1,w2]) session.commit()2、一對(duì)多外鍵(2)relationship
?第二種方法和第一種一樣,只是這里改用了relationship來(lái)做外鍵關(guān)系,代碼如下:
#!/usr/bin/env python # -*- coding:utf-8 -*-from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,ForeignKey,UniqueConstraint,Index,String from sqlalchemy.orm import sessionmaker,relationship from sqlalchemy import create_engineengine = create_engine('mysql+pymysql://root@127.0.0.1:3306/db1')Base = declarative_base()class Son(Base):__tablename__ = 'son'id = Column(Integer,primary_key=True)name = Column(String(32))age = Column(String(32))father_id = Column(Integer,ForeignKey('father.id'))class Father(Base):__tablename__ = 'father'id = Column(Integer,primary_key=True)name = Column(String(32))age = Column(String(32))son = relationship('Son')Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) session = Session()f1 = Father(name = 'zhangyanlin',age = '18')w1 = Son(name = 'xiaozhang1',age = '3') w2 = Son(name = 'xiaozhang2',age = '4') # 重點(diǎn)是這里綁定關(guān)系 f1.son = [w1,w2] # 只需要把父親給傳進(jìn)去,兒子的自然就上傳進(jìn)去啦 session.add(f1) session.commit()總結(jié)
以上是生活随笔為你收集整理的python数据库操作之pymysql模块和sqlalchemy模块(项目必备)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: FreeRtos osMessageP
- 下一篇: python Celery 分布式任务队