|
我最近从网上得知python的ORM套件SQLAlchemy访问数据库十分方便,特别是它能够访问我所钟爱的oracle和MySql数据库,我从网上查找到一些例子程序,再加SQLAlchemy自带的说明文档。逐渐摸索出了SQLAlchemy运行的简单规律,在此感谢limodou先生的大力指点。
SQLAlchemy是一个十分优秀的ORM,它在执行一个查询时有多个层次:
1. engine 2. table meta 3. mapper
第一种方式最简单,利用引擎直接输入SQL语句,与其它SQL查询控件一样.但常用的是后两种,第二种相当于简单化的sql操作.第三种为ORM的使用方式.
以下为我的源码,我使用的是oracle和Mysql的双重连接,要求必须安装MySqldb和cx_Oracle。
from sqlalchemy import * import sqlalchemy.util as util import string, sys mysql_engine = create_engine('mysql', {'db':'test','user':'root','passwd':'caoyan','host':'127.0.0.1'}, echo=True) #创建Mysql连接 oracle_engine = create_engine('oracle',{'dsn':'netbill_192.168.10.100','user':'system','password':'winjoin'},echo=True) #创建oracle连接 conn = mysql_engine.connection() #得到连接对象
rsscategory = Table('rss_category',mysql_engine,Column('id',Integer,primary_key = True),Column('name',String,nullable = True),Column('tbuseraccountsinfolisttemptest',String,nullable=True),Column('sum',Number,nullable=True))
rssoracle = Table('TbOperator',oracle_engine,Column('OperatorName',String))
#rsscategory.create() #tmpid = rsscategory.c.keys() #print tmpid
s = select([func.count(rsscategory.c.id)]).execute() s = rsscategory.select()
usernametemptest='createcao'
tmp = rsscategory.select(rsscategory.c.tbuseraccountsinfolisttemptest==usernametemptest).execute().fetchall() #取出名为'createcao'的所有记录
'''
注意,上句在mysql下执行可能正常,但在oracle下执行将会出错,原因是tbuseraccountsinfolisttemptest_usernametemptest标识符名长度超过32个字符,可通过绑定名字的方法解决,可将上句换为:
'''
tmp = rsscategory.select(rsscategory.c.tbuseraccountsinfolisttemptest==bindparam('username')).execute(username = usernametemptest).fetchall()
rsscategory.update(rsscategory.c.id==1,values(rsscategory.c.sum:rsscategory.c.sum + 5)).execute() #用字段进行计算操作 a = rsscategory.delete(rsscategory.c.id==4).execute() #删除id=4的记录 c = s.execute() print c.rowcount print rsscategory.c.id #mysql_engine.execute("insert into rss_category values(1,'cao')") * #rsscategory.insert().execute(id=5,name='cao') #插入记录 conn.commit() objectstore.commit(a) #提交己被删除的记录 #result = mysql_engine.execute("select * from rss_category") #rsscategory.execute("select * from rsscategory",echo=True) #result = select([resscategory],echo=True) result = rsscategory.select(rsscategory.c.name == 'cao').execute() result.fetchall() r = result.fetchone() print result.rowcount print result.fetchone
tmpstr = r print rsscategory.c.keys print tmpstr class User(object): pass usermapper = mapper(User,rsscategory)
user = usermapper.select_by(id=1)[0]
myuser = User() myuser.name = "jfkdosjaof" myuser.id = 7 #myuser.name = 'yan'
User.mapper = mapper(User,rsscategory)
u = User(8,"yan") u.name = 'aaa' #插入一打记录
objectstore.commit(u) #commit('需要提交的对象') temp = u.mapper.select_text("select * from rss_category") #用SQL语句查找数据集, for tmp1 in temp: print tmp1.id print tmp1.name
temp = u.mapper.select_text("update rss_category set name='yan' where name='cao3'") objectstore.commit(u) print temp temp1 = u.mapper.select_by(name='aaa',id=15) #执行一个SQL 相当于And连接 for tmp2 in temp1: print tmp2.id print tmp2.name
user2 = u.mapper.get_by(name='aaa') #返回一条附合条件的记录,如果查到多条,则返回第一个记录 print user2.id print user2.name
temp3 = u.mapper.select_by_name('aaa') #得到多条记录 好象只能是字符型 for tmp2 in temp3: print tmp2.id print tmp2.name
b = u.mapper.delete_obj(u.c.id==3) objectstore.commit(b)
temp4 = u.mapper.get(5) #得到第几条记录 print temp4.id print temp4.name
myobj = u.mapper.get(5,2,'cao') print myobj.id print myobj.name
re_sel = u.mapper.select(or_(myobj.c.id==1,myobj.c.name=='aaa')) #用or条件查询数据库 for tmp5 in re_sel: print tmp5.id print tmp5.name
re_se1 = u.mapper.select(user2.mapper.select(user2.c.name=='aaa')) for tmp6 in re_se1: print tmp6.id print tmp6.name #print temp.id print temp.name print user.count while(not user): print user[0] print "%s" % r
由于小弟初次接触SQLAlchemy,难免有谬误之处,如有不妥之处,还请各位指正。
SQLAlchemy的安装也十分方便,需要得到egg文件,可以将原先安装成功的文件考贝保存下来,以后都可以使用。就不需要再从网上下载了(由于版本升级的问题,旧版本的安装包不一定能从网上下来)。具体要保留下来的有:
$installPythonDir$/Lib/site-packages/sqlalchemy-0.1.2-py2.4.egg (文件夹,此为SQLAlchemy的安装目录)
$installPythonDir$/Lib/site-packages/easy-install.pth (路径文件,内容指向了SQLAlchemy)
<内容举例>
sqlalchemy-0.1.2-py2.4.egg #此指向了SQLAlchemy的安装目录
得到以上一个文件和文件夹后就可以通过复制到python安装目录下的Lib/site-packages/下即可完成SQLAlchemy的安装。简单吧,我在windows和Linux下都试过了,完全可行。但要注意,SQLAlchemy只是一个上层调用组件,具体要访问数据库还需要安装其它访问驱动,例如,要访问Mysql,还需要安装MySQLdb,当然,用了SQLAlchemy的确方便快捷多了。 |