ORM单表操作
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()