ORM
直接使用sql语句虽然方便,但缺点是如果要更换数据库可能还需要修改程序中的Sql语句。为了解决这个问题,出现了ORM。在Python语言中使用ORM有多种选择,都是通过模块支持的。
比较著名的有SQLAlchemy和SQLObject,SQLObject比SQLAlchemy简单的多,但是网上实例太少,所以建议使用SQLAlchemy
SQLAlchemy模式
首先安装所需模块
pip install SQLAlchemy
pip install pymysql
本实例使用了名为test的数据库,所以在运行本例之前,要确保db1数据库已经存在
1、创建表
在app下创建一个test.py 输入如下内容:
from sqlalchemy import create_engine,MetaData,Table,Column,Integer,String,Float,exc,orm
from sqlalchemy.ext.declarative import declarative_base
#定义mysql连接字符串
mysql='mysql+pymysql://root:jenkins@123@192.168.0.93:3306/db1?charset=utf8'
#创建数据库引擎(sqlalchemy.engine.base.Engine 对象)
engine=create_engine(mysql,encoding='utf-8')
#开始连接数据库
engine.connect()
#创建MetaData对象
metadata=MetaData(engine)
#创建用于描述表中字段信息的Table对象
person=Table('user',metadata,
Column('id',Integer,primary_key=True),
Column('name',String(30)),
Column('age',Integer))
#创建表
metadata.create_all(engine)
2、完整增、删、改、查 实例
在app下添加一个test.py文件输入如下内容:
from sqlalchemy import create_engine,MetaData,Table,Column,Integer,String,Float,exc,orm
from sqlalchemy.ext.declarative import declarative_base
#定义用于mysql连接字符串,通过pymysql指定sqlalchemy底层用的pymysql模块
#操作mysql,root是用户名,jenkins@123是密码db5是数据库名
mysql='mysql+pymysql://root:jenkins@123@192.168.0.93:3306/db5?charset=utf8'
#定义要操作的表名
tableName='tb5'
#创建数据库引擎(sqlalchemy.engine.base.Engine 对象)
engine=create_engine(mysql,encoding='utf-8')
#开始连接数据库
engine.connect()
#创建MetaData对象
metadata=MetaData(engine)
#创建用于定义表元数据的Table对象,该表一共5个字段,字段id是主键
person=Table(tableName,metadata,
Column('id',Integer,primary_key=True),
Column('name',String(30)), #长度30的字符串类型
Column('age',Integer),
Column('address',String(100)), #长度为100的字符串类型
Column('salary',Float))
#创建表
metadata.create_all(engine)
Base=declarative_base()
#定义与information表对应的Person类
class Person(Base):
#指定表名
__tablename__=tableName
id=Column(Integer,primary_key=True)
name=Column(String(30))
age=Column(Integer)
address=Column(String(100))
salary=Column(Float)
Session=orm.sessionmaker(bind=engine)
# 创建会话(Session)
session=Session()
#(增)
#先删除person1表中所有的记录,以免在插入记录时造成主键冲突
session.query(Person).delete()
#提交后对数据库的修改才生效
session.commit()
# 下面创建3个Person对象
person1=Person(id=10,name='Bill',age=30,address='地球',salary='1111')
person2=Person(id=20,name='Mike',age=40,address='火星',salary='2222')
person3=Person(id=30,name='John',age=50,address='月球',salary='3333')
# 下面向information表中插入3条记录
session.add(person1)
session.add(person2)
session.add(person3)
#提交后对数据库的修改才生效
session.commit()
print("成功插入记录")
#(改)
#先查询name=Mike的记录,然后将所有记录的address字段替换成“千星之城”
session.query(Person).filter(Person.name == 'Mike').update({'address': '千星之城'})
#提交修改
session.commit()
#(查+改)
#查询所有name等于John的记录
query=session.query(Person).filter(Person.name == 'John')
#输出了用于查询的SQL语句(由SQLAlchemy字段生成)
print(query)
#将查新的结果集转为单一的对象(Person对象),使用scalar方法时必须要保证查询结果集只有一条记录,
person=query.scalar()
#修改person对象的属性值
person.age=12
person.salary=5000
#提交修改
session.commit()
print('成功更新了记录')
#使用组合条件查询information表中的记录
persons=session.query(Person).filter((Person.age>=10) & (Person.salary>=2000))
#通过对查询结果进行迭代,输出所有查询结果,
for person in persons:
print('name','=',person.name,end=' ')
print('age','=',person.age,end=' ')
print('salary','=',person.salary,end=' ')
#输出查询结果中的第1条记录的name字段值
print(persons.first().name) #试过不管用
#输出查询结果中第2条记录的name字段值
print(persons.offset(1).scalar().name) #一共2行记录,查询最后一行记录。3行记录就报错,1行记录也报错
#(删)
#删除person2对象的记录
session.delete(person2)
session.commit()
#关闭session
session.close()
SQLObject模式(没做成)
安装模块
pip install sqlobject
本例使用了名为test的数据库,在运行本例之前,请确保test数据库已经存在,并确保用户名和密码正确,以及已经开启了mysql服务。
from sqlobject import *
from sqlobject.mysql import builder
import json
#定义用于连接mysql数据库的字符串,root:用户名 jenkins@123:密码
#test:数据库名
mysql='mysql://root:jenkins@123@192.168.0.93:3306/test?charset=utf8'
#连接mysql数据库,并通过driver关键字参数指定SQLObject底层使用的操作数据库的模块是pymysql
sqlhub.processContion=connectionForURI(mysql,driver='pymysql')
#定义ORM类,该类需要从SQLObject继承
class Person(SQLObject):
class sqlmeta:
# 指定表名,如果不指定表名,默认将类名的小写作为表名,也就是person
table='t_persons'
name=StringCol(length=30)
age=IntCol()
address=StringCol(length=30)
salary=FloatCol()
try:
# 删除t_persons表
Person.dropTable()
except:
pass
# 创建t_persons表
Person.createTable()
print('成功创建了Person表')
#下面的代码向t_persons表中插入了3条记录
person1=Person(name='Bill',age=55,address='地球',salary=1234)
person2=Person(name='Mike',age=65,address='地球',salary=4321)
person3=Person(name='Bill',age=15,address='地球',salary=4000)
print("成功插入了3条记录")
#修改t_persons表的记录,每修改一个属性,修改的结果就会立刻体现在t_persons表中
person2.name="李宁"
person2.address="北京"
#查询t_persons表中的数据,直接返回Person对象类型的列表
persons=Person.selectBy(name='Bill')
print(persons[0])
print(persons[0].id)
print(persons[0].name)
print(persons[0].address)
#定义一个方法,将Person对象转换为字典形式
def person2Dict(obi):
return {
'id':'obj.id',
'name':'obj.name',
'age':'obj.age',
'address':'obj.address',
'salary':'obj.salary',
}
#将Person对象转换为JSON字符串
jsonStr=json.dumps(persons[0],default=person2Dict,ensure_ascii=False)
print(jsonStr)
#删除persons[0]在t_persons表中对应的表
persons[0].destroySelf()