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 语句)

 

posted @ 2018-07-02 15:50  虫儿要吃草  阅读(235)  评论(0编辑  收藏  举报