15 python之ORM sqlalchemy模块使用
1 1,首先当然是环境配置 2 3 保证python安装目录下已经有以下两个工具中的一个 4 环境变量path设置已经添加了以下两个工具的路径 5 执行以下命令即可安装成功: 6 7 easy_install SQLAlchemy 8 # 或者 9 pip install SQLAlchemy 10 11 12 当然我使用的是Windows环境,所以倾向于使用setup.py安装,下载压缩包,解压,然后命令提示符下切换到该目录,再运行下面的命令: 13 复制代码 代码如下: 14 python setup.py install 15 16 2,安装cx_Oracle模块 17 pip install cx_Oracle (默认安装最新版本6.1 不推荐此安装方法,因为可能导到与当前python版本不兼容) 18 19 报错:cx_Oracle.DatabaseError: DPI-1050: Oracle Client library must be at version 11.2 错, 20 解决方法:下载低版本的cx_Oracle即可 21 22 卸载安装的模板: 23 pip uninstall cx_Oracle 24 25 https://pypi.python.org/pypi/cx_Oracle/5.3 26 https://sourceforge.net/projects/cx-oracle/files/5.1.2/ 27 推荐去网站下载对应的版本的cx_Oracle包 28 29 30 报错:cx_Oracle ORA-24315: 非法的属性类型的解决办法 31 是因为安装的cx_Oracle不是指定数据库的,我们用的是10g的,所以要找10G的cx_Oracle 32 33 报错:以上好了后,如果还不行 34 要查看ORACLE安装的64位的还是32位的,如果是32位的,则cx_Oracle也必须是32位的 35 36 37 2,使用python自带的数据库SQLite3(运行在内存中的) 38 39 ############################################################################# 40 1.初始化连接 41 42 from sqlalchemy import create_engine 43 from sqlalchemy.orm import sessionmaker 44 ##DB_CONNECT_STRING = 'mysql+mysqldb://root:123@localhost/ooxx?charset=utf8' 45 ##DB_CONNECT_STRING='oracle://apps:apps@10.0.0.100:1522/VID' 46 DB_CONNECT_STRING='oracle+cx_oracle://zk:gR2b_bs1Qn@bill' 47 48 49 engine = create_engine(DB_CONNECT_STRING, echo=True) ##会返回一个数据库引擎 50 DB_Session = sessionmaker(bind=engine) ###会生成一个数据库会话类 51 session = DB_Session() ##这个类的实例可以当成一个数据库连接, 52 53 说明: 54 这里的 DB_CONNECT_STRING 就是连接数据库的路径。 55 “mysql+mysqldb”指定了使用 MySQL-Python 来连接, 56 “root”和“123”分别是用户名和密码, 57 “localhost”是数据库的域名, 58 “ooxx”是使用的数据库名(可省略), 59 “charset”指定了连接时使用的字符集(可省略)。 60 61 create_engine() 会返回一个数据库引擎,echo 参数为 True 时,会显示每条执行的 SQL 语句,生产环境下可关闭。 62 63 sessionmaker() 会生成一个数据库会话类。 64 65 session = DB_Session() 这个类的实例可以当成一个数据库连接, 66 它同时还记录了一些查询的数据,并决定什么时候执行 SQL 语句。 67 由于 SQLAlchemy 自己维护了一个数据库连接池(默认 5 个连接),因此初始化一个会话的开销并不大。 68 69 70 ############################################################################# 71 2,ORM方式,创建表,删除表 72 73 from sqlalchemy import Column 74 from sqlalchemy.types import CHAR, Integer, String 75 from sqlalchemy.ext.declarative import declarative_base 76 77 BaseModel = declarative_base() ##declarative_base() 创建了一个 BaseModel 类,这个类的子类可以自动与一个表关联。 78 79 def init_db(): 80 BaseModel.metadata.create_all(engine) ##BaseModel.metadata.create_all(engine) 会找到 BaseModel 的所有子类,并在数据库中建立这些表; 81 82 def drop_db(): 83 BaseModel.metadata.drop_all(engine) ##BaseModel.metadata.create_all(engine) 会找到 BaseModel 的所有子类,并在数据库中删除这些表。 84 85 86 class User(BaseModel): 87 __tablename__ = 'user' 88 89 id = Column(Integer, primary_key=True) 90 name = Column(CHAR(30)) # or Column(String(30)) 91 92 init_db() 93 94 ##说明: 95 以 User 类为例,它的 __tablename__ 属性就是数据库中该表的名称, 96 它有 id 和 name 这两个字段,分别为整型和 30 个定长字符。 97 Column 还有一些其他的参数,我就不解释了。 98 99 ############################################################################# 100 3,ORM方式插入数据 101 user = User(name='b',id=2) 102 session.add(user) 103 session.commit() 104 105 ############################################################################# 106 4,ORM方式查询数据 107 query = session.query(User) 108 print query # 显示SQL 语句 SELECT hyy_user.id AS hyy_user_id, hyy_user.name AS hyy_user_name FROM hyy_user 109 print query.statement # 同上 SELECT hyy_user.id, hyy_user.name FROM hyy_user 110 ###---------遍历----------------- 111 for user in query: # 遍历时查询 112 print user.id,user.name 113 114 2 b 115 1 a 116 117 ###---------遍历----------------- 118 for user in query.all(): # 也可以这样遍历时查询(对象组成的列表) 119 print user.id,user.name 120 121 122 123 ###---------排序后遍历----------------- 124 for user in query.order_by(User.name): # 遍历时查询 125 print user.id,user.name 126 127 ##----------按条件查询后遍历------------------------- 128 for value in query2.filter(User.id.in_([1,2])).all(): 129 print value.name 130 131 132 133 ##----------查询所有字段------------------- 134 135 print query.all() # 返回的是一个列表,每个元素即是一行数据,即对象(由对象组成的列表) 例:[<__main__.User object at 0x02D57210>, <__main__.User object at 0x02CF56D0>] 136 print query.first().name # 记录不存在时,first() 会返回 None(返回的是第一行数据的一个字段) b 137 print query.filter(User.id == 2).first().name ##获取USER_ID=2的一行数据的name字段 138 print query.filter('id = 2').first().name # 支持字符串 等效于上句,好象有点问题,这句语句 139 140 ##------------查询某个字段----------------- 141 142 query2 = session.query(User.name) ##返回的是一个列表,列表的元素是每行数据的一个字段(由元组组成的列表) 143 print query2 ##SELECT hyy_user.name AS hyy_user_name FROM hyy_user 144 print query2.all() ## [('b',), ('a',)] 145 for user in query2: # 遍历时查询(元组组成的列表) 146 print user[0] 147 148 b 149 a 150 151 ########################## Table 构造器 ################################################# 152 Table 构造器(代表了 SQL CREATE TABLE 语句)