zoukankan      html  css  js  c++  java
  • 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 语句)
  • 相关阅读:
    博客美化
    hello world
    mysql数据库索引
    Golang:线程 和 协程 的区别
    计算机网络详解
    Redis持久化机制
    nginx 详解
    多级缓存的分层架构
    svn忽略文件不提交至服务器的方法
    Mysql 事务及其原理
  • 原文地址:https://www.cnblogs.com/2mei/p/9254192.html
Copyright © 2011-2022 走看看