Python ORM 实现及python在linux下连接oracle

ORM “Object Relational Mapping”,即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码更简单,不用直接操作SQL语句。

orm模块:orm.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

‘ Simple ORM using metaclass ‘

__author__ = ‘Michael Liao‘

class Field(object):
    def __init__(self, name, column_type):
        self.name = name
        self.column_type = column_type
    def __str__(self):
        return ‘<%s:%s>‘ % (self.__class__.__name__, self.name)

class StringField(Field):
    def __init__(self, name):
        super(StringField, self).__init__(name, ‘varchar(100)‘)

class IntegerField(Field):
    def __init__(self, name):
        super(IntegerField, self).__init__(name, ‘bigint‘)

class ModelMetaclass(type):

    def __new__(cls, name, bases, attrs):
        if name==‘Model‘:
            return type.__new__(cls, name, bases, attrs)
        print(‘Found model: %s‘ % name)
        mappings = dict()
        for k, v in attrs.iteritems():
            if isinstance(v, Field):
                print(‘Found mapping: %s ==> %s‘ % (k, v))
                mappings[k] = v
        for k in mappings.iterkeys():
            attrs.pop(k)
        attrs[‘__mappings__‘] = mappings # 保存属性和列的映射关系
        attrs[‘__table__‘] = name # 假设表名和类名一致
        return type.__new__(cls, name, bases, attrs)

class Model(dict):
    __metaclass__ = ModelMetaclass

    def __init__(self, **kw):
        super(Model, self).__init__(**kw)

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"‘Model‘ object has no attribute ‘%s‘" % key)

    def __setattr__(self, key, value):
        self[key] = value

    def save(self):
        fields = []
        params = []
        args = []
        for k, v in self.__mappings__.iteritems():
            fields.append(v.name)
            params.append(‘?‘)
            args.append("‘"+str(getattr(self, k, None))+"‘")
        sql = "insert into {table} ({keys}) values ({value})".format(table=self.__table__,keys=‘,‘.join(fields),value=‘,‘.join(args))
        print(‘SQL: %s‘ % sql)
        print(‘ARGS: %s‘ % str(args))
    return sql

# testing code:
class productInfo(Model):
    productID = IntegerField(‘productID‘)
    productName = StringField(‘productName‘)
    parentID = IntegerField(‘parentID‘)
    clickNum = IntegerField(‘clickNum‘)

test = productInfo(productID=12345, productName=‘Iphone‘, parentID=1111, clickNum=99999)
sql=test.save()

import cx_Oracle
db = cx_Oracle.connect(‘AIDBA/[email protected]‘)
cursor= db.cursor()
cursor.execute(sql)
db.commit()

执行 python orm.py

[[email protected] pythonscript]$ python orm.py
Found model: productInfo
Found mapping: parentID ==> <IntegerField:parentID>
Found mapping: clickNum ==> <IntegerField:clickNum>
Found mapping: productName ==> <StringField:productName>
Found mapping: productID ==> <IntegerField:productID>
SQL: insert into productInfo (clickNum,productName,productID,parentID) values (‘99999‘,‘Iphone‘,‘12345‘,‘1111‘)
ARGS: ["‘99999‘", "‘Iphone‘", "‘12345‘", "‘1111‘"]

数据库查看

相关:

Python连接Oracle数据库需要依赖第三方模块 cx_Oracle

cx_Oracle的安装:

(1)pip : pip install cx_Oracle

(2)rpm :rpm -ivh cx_Oracle-5.1.1-11g-py26-1.x86_64.rpm        需要对应oracle版本的安装包

环境变量的配置:

需要oracle用户的所有环境变量,所以最好在oracle用户下使用,另外需在oracle用户下.bash_profile文件中新增一行

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:/usr/lib

保存然后 source .bash_profile

遇到的一个问题:

修改前的save()

def save(self):
        fields = []
        params = []
        args = []
        for k, v in self.__mappings__.iteritems():
            fields.append(v.name)
            params.append(‘?‘)
            args.append(str(getattr(self, k, None)))
        sql = "insert into %s (%s) values (‘%s‘)" % (self.__table__, ‘,‘.join(fields), ‘,‘.join(args))
        print(‘SQL: %s‘ % sql)
        print(‘ARGS: %s‘ % str(args))
return sql

执行结果

SQL: insert into productInfo (clickNum,productName,productID,parentID) values (‘2222,Michael,12345,1111‘)
ARGS: [‘2222‘, ‘Michael‘, ‘12345‘, ‘1111‘]
Traceback (most recent call last):
  File "orm.py", line 83, in <module>
    cursor.execute(sql)
cx_Oracle.DatabaseError: ORA-00947: not enough values

执行的sql格式存在问题

将 args.append(str(getattr(self, k, None))) 修改为args.append("‘"+str(getattr(self, k, None))+"‘") 解决。

时间: 2024-10-29 19:11:08

Python ORM 实现及python在linux下连接oracle的相关文章

linux下安装Oracle时交换空间不足的解决方法

摘:linux下安装Oracle时交换空间不足的解决方法 linux上安装Oracle时交换空间不足的解决办法 增加交换空间有两种方法: 严格的说,在系统安装完后只有一种方法可以增加swap,那就是本文的第二种方法, 至于第一种方法应该是安装系统时设置交换区. 1.使用分区: 在安装OS时划分出专门的交换分区,空间大小要事先规划好,启动系统时自动进行mount. 这种方法只能在安装OS时设定,一旦设定好不容易改变,除非重装系统. 2.使用swapfile:(或者是整个空闲分区) 新建临时swap

linux下重启oracle服务:监听器和实例

一.在Linux下重启Oracle数据库及监听器: 方法1: 用root以ssh登录到linux,打开终端输入以下命令: cd $ORACLE_HOME #进入到oracle的安装目录 dbstart #重启服务器 lsnrctl start #重启监听器 cd $ORACLE_HOME #进入到oracle的安装目录 dbstart #重启服务器 lsnrctl start #重启监听器 ----------------------------------- 方法2: Sql代码 cd $OR

Linux下修改Oracle监听地址

如果你的服务器换了ip怎么办? 如果你的服务器换了名字怎么办? 以前的小伙伴怎么办? 以前的老客户怎么办? 没关系,简单教你修改监听地址,老朋友随便找! 想要修改监听地址首先要找到两个文件,确定两样东西! 第一 你的主机名字? 第二 你的IP地址? 第三 你的listener.ora在哪里? 第四 你的tnsnames.ora在哪里? 原来的文件监听的是localhost,这个名字在/etc/hosts中会被映射成Ip地址127.0.0.1 lisenter.ora 目录在 /opt/oracl

linux下安装oracle需要的配置

1.检查系统包安装情况 rpm -qa|grep binutils rpm -ivh sysstat-7.0.2.rpm binutils-2.17.50.0.6 compat-libstdc++-33-3.2.3 compat-libstdc++-33-3.2.3 (32 bit) elfutils-libelf-0.125 elfutils-libelf-devel-0.125 gcc-4.1.2 gcc-c++-4.1.2 glibc-2.5-24 glibc-2.5-24 (32 bit

Linux下安装Oracle的过程和涉及的知识点-系列5

12.命令行启动 由于我是用VM进行安装的,所以首先需要修改默认启动为命令行的方式. 使用root登录,编辑/etc/inittab文件,将d:5:initdefault:改为d:3:initdefault: 知识点6:Linux的运行级别 # 0 - 停机(千万不能把initdefault 设置为0) # 1 - 单用户模式 # s init s = init 1 # 2 - 多用户,没有 NFS # 3 - 完全多用户模式(标准的运行级) # 4 - 没有用到 # 5 - X11 多用户图形

Ubuntu Linux下安装Oracle JDK

Ubuntu Linux下安装Oracle JDK Dennis Hu 2014-4-22 说明:因为非常多系统不支持使用OpenJDK,因此在ubuntu下会须要安装Oracle JDK.而Oracle JDK的安装貌似没有提供apt方式,因此安装Oracle JDK的方式相对麻烦一些,我常常安装,为了方便别人同一时候方便自己查看,把它记下来. 第一步:区分32位还是64位操作系统 先确定你的ubuntu linux是32位还是64位的,方法非常多,这里介绍一种就可以. $uname -a 第

Linux下的Oracle 11gr2安装完成的的自启动操作。

Linux下的Oracle在安装结束后是处于运行状态的.重启机器后,Oracle不会像在Windows下那样将Oracle添加到Windows服务,在linux下需要手动启动Orcle服务 以oracle用户下,执行下面的命令 进入sqlplus $ sqlplus /nolog 以sysdba的身份连接到数据库,并启动Oracle数据库引擎 SQL> conn /as sysdba SQL> startup 退出sqlplus,运行Listener SQL> exit $ lsnrct

Linux下安装oracle 11g数据库(一)

Linux下安装oracle 11g数据库(一) 1 内存的要求 最低配置: 1 GB of RAM 推荐配置: 2 GB of RAM or more 确定内存大小,输入下面的命令:grep MemTotal /proc/meminfo 确定系统版本,输入下面的命令:uname –m 确定交换空间的大小,输入下面的命令:grep SwapTotal /proc/meminfo 确定可用的内存和交换空间,输入下面的命令:free 2 磁盘空间要求 数据库软件 数据库软件需要的大小 企业版 4.7

Linux下修改Oracle数据库字符集命令

常见情形:从服务器备份Oracle数据库后再到本地机器上还原Oracle数据库的时候经常会碰见数据库字符编码不一致的情况,可以用以下命令来修改本地的Oracle数据库字符编码,然后顺利还原Oracle数据库到本地机器上 操作指令: [[email protected] ~]$ sqlplus /nolog SQL> conn /as sysdba; SQL>select userenv('language') from dual; SQL>SHUTDOWN IMMEDIATE SQL&g