`
k_cancer
  • 浏览: 35536 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

SQLAlchemy学习笔记1

阅读更多

1.在已有的数据库上建立model对象有两种办法。

 

   1> 先创建Table对象,然后创建要映射的object对象,用mapper将之映射起来。例子如下:

 

   department = Table('crew_section',
                      Column('rid',Integer,primary_key=True),
                       Column('birthdate', NormalDate),
                       Column('employmenttype',Integer,ForeignKey(department.c.rid)),
                    meta,autoload=True,autoload_with=engine)


class Department(object):
    def __repr__(self):
        return "<%s>"% repr(self.__class__.__name__)

mapper(Department, department)
    

 

crew_section是数据库中表的名字,在瘟到死下大小写不敏感,所以不用区分大小写,在os x下是则需要区分大小写。

 

用这种办法创建出来的映射对象,只重载明确表示出来的字段如代码中的‘birthdate’字段(做自定义的类型转换)、'employmenttype'字段(做映射的外键),其他未重载的字段可以直接以属性的形式倍调用如 department.other.

 

2>直接继承自DeclarativeBase:

 

class CrewBase(DeclarativeBase):
    __tablename__ ='crew_base'
    
    #{ Attributes
    id = Column('rid', Integer, primary_key=True)
    name = Column('crewbasecode', PopularString)
    description = Column('description', Text)
    #}
    
    def __repr__(self):
        return " <Base code:%s ,description:%s>"  % (self.code, self.description)

  crew_base 是数据库的表名。

  这样做必须对所有的字段重载,否则其他的属性不能被调用。

  对于已有的数据库,建议使用这种办法,这样可以清楚表明对象的设计结构。而且可以将建好的数据库字段名改为自己认为比较合适的。(个人项目比较特殊)

 

2 一对多的操作(基于继承自 DeclarativeBase的办法)

 

department_id = Column('employmenttype', Integer, ForeignKey(Department.id))  
department = relation(Department, backref=backref('crew_member', order_by=Department.id))

 

    第一行代码将数据库中的字段以外键形式重载,第二行代码建立外键,外键映射对象,本对象之间的关系

 

   之后可以直接实例化对象。用instance.department来取出对象的department属性。

 

    crew_member => 本对象所映射的表名。

 

  这里 一个department具有多个crew 主动关联的一方在crew。

 

3. 多对多的操作。

 

    先将多对多关系的中间表建立Table对象:

 

 

crew_base_period = Table('crew_base_period', metadata,
                         Column('crewrid',Integer, ForeignKey('crew_member.rid')),
                         Column('crewbaserid', Integer, ForeignKey('crew_base.rid')),
                         Column('startdate', NormalDate),
                         Column('enddate', NormalDate)
                         )

 

 在主动关联的一方写下如下语句:

 

 

   bases = relation(CrewBase, secondary=crew_base_period, backref='crew_member') 

 

 CrewBase是要关联的对象,将中间表对象传给secondary参数,backref为自己的表。

 

  实例化之后就可以直接调用instance.bases来查找自己想要的属性。

 

4.自定义类型转型

 

 

class PopularString(types.TypeDecorator):
    "to remove some unuseful data and convert the decode it"
    
    impl = types.String
    
    def process_bind_param(self, value, dialect):
        return "PREFIX:" + value
    
    def process_result_value(self, value, dialect):
        return value.strip().decode('gbk')

 

    impl是要转化的值本来的类型,prosess_bind_param处理从程序到db的操作,prosess_bind_param处理从db到程序的操作。

 

   定义好之后,直接将类名写到定义Column的地方就好了。如:

 Column('birthdate', NormalDate)

 

   但是很奇怪的是,用自定义好的类型,用query.filter()查询,类型转换可以起作用。如果用from_statement发送sql就要用下面的办法。

 

 

typemap = {
           'lastname' : PopularString,
           'firstname' : PopularString,
           'birthdate' : NormalDate,
           'inservicedate' : NormalDate,
           'outservicedate': NormalDate,
           'upgradeddate' : NormalDate,
           'sex': PopularGender
                                }



crew = DBSession.query(Crew).from_statement(text("SELECT * from crew_member where "  +
                                                "rtrim(crew_member.lastname) || rtrim(crew_member.firstname) " +
                                                " like '%" + crew_name + "%'", typemap=typemap)).first()



 

 (再次说明,本人的项目很妖怪,其实不用写这么复杂,如果你不小心google到这里来了,希望不要误导了你)

 

   需要先格外的写个text,typemap中即为{‘字段名’:自定义类型}的字典。

 

5. 其他的一些小问题

 

   sqlalchemy可以直接这样操作字段(以Crew为对象)

 

 

        crew = DBSession.query(Crew).filter((Crew.last_name + Crew.first_name).like(u'%XX%'.encode('gbk'))).first()

 

  即使用 + 来代替数据库的连接符

 

 

   filter 和 from_statement 似乎有冲突,不能对同一条记录查询。

 

 

 6.一切框架都是浮云(by Hsu Jeffrey

 

    Jeffrey兄说得很对。。。最近两个星期研究sqlalchemy看来,不管是怎么样的操作,其实归根到底,依旧是化为sql来对数据库操作。所以还是得好好研究研究底层点的东西。

 

  附件为例子,包含本文大部分的例子。

 

分享到:
评论

相关推荐

    Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍

    1. 创建映射类的实例(Instance) 前面介绍了如何将数据库实体表映射到Python类上,下面我们可以创建这个类的一个实例(Instance),我们还是以前一篇文章的User类为例,让我们创建User对象:复制代码 代码如下:&gt;&gt;&gt; ed_...

    Python ORM框架SQLAlchemy学习笔记之关系映射实例

    昨天简单介绍了SQLAlchemy的使用,但是没有能够涉及其最精彩的ORM部分,今天我将简单说明一下,当然主要还是讲解官方文档的内容,由于是学习笔记,有可能存在精简或者自己理解的部分,不做权威依据。 当我们开始使用...

    Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例

    初次学习,也没实质感觉到SQLAlchemy的好处,不过看其介绍的很多大公司均采用该项目,而且其支持的数据库还是蛮丰富的,所以我觉得花点时间研究还是值得的。不过令人遗憾的是关于SQLAlchemy的中文资料比较少,所以...

    Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍

    1. 添加一个新对象 前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中:复制代码 代码如下:ed_user = User(‘ed...

    Python ORM框架SQLAlchemy学习笔记之数据查询实例

    前期我们做了充足的准备工作,现在该是关键内容之一查询了,当然前面的文章中或多或少的穿插了些有关查询的东西,比如一个查询(Query)对象就是通过Session会话的query()方法获取的,需要注意的是这个方法的参数数目...

    python学习笔记说明的PPT

    ### Python学习笔记说明的PPT知识点详述 #### 一、Python简介 - **Python的特点**: - **优雅**:简洁清晰的语法结构。 - **明确**:避免使用隐晦的方式解决问题。 - **简单**:尽可能简化语言结构。 - **...

    《传智Python就业班》学习笔记.zip

    【标题】"《传智Python就业班》学习笔记"揭示了这是一个关于Python编程语言的教育课程,特别是针对求职者或想要提升Python技能以在职场上获得更好机会的学习者。这可能是一个综合性的学习资源,涵盖了从基础到进阶的...

    flask框架学习笔记

    以下是从提供的“flask框架学习笔记”中提取并展开的重要知识点。 ### 一、Flask 路由 Flask 中的路由是用来匹配 URL 的一种方式,通过装饰器 `@app.route` 来定义。例如: ```python @app.route('/') def index()...

    python全套学习笔记

    "Python全套学习笔记"涵盖了从入门到进阶的所有关键知识点,是学习Python编程的理想资源。以下是一些主要的学习要点: 1. **基础语法**:Python的基础始于变量、数据类型(如整数、浮点数、字符串、布尔值)以及...

    FlaskWeb开发:基于Python的Web应用开发实战-学习笔记.zip

    通过这本书的学习笔记,我们可以了解到许多关于Flask和Web开发的关键知识点。 1. **Flask基础**:首先,书中会介绍Flask的基本结构,包括如何创建一个基本的Flask应用、定义路由、编写视图函数以及如何返回HTTP响应...

    pyramid学习笔记3

    在本篇“Pyramid学习笔记3”中,我们将聚焦于Pyramid框架的用户注册功能的实现,这是一个Python Web开发框架,以其灵活性和可扩展性著称。Pyramid提供了构建复杂和简单Web应用所需的基础,而不会强加特定的设计模式...

    Flask学习笔记(5)源码

    **Flask学习笔记(5)源码** 在深入探讨Flask框架的源码之前,我们先来了解一下Flask的基本概念。Flask是一个轻量级的Web服务器网关接口(WSGI)微框架,由Armin Ronacher开发。它以其简单易用、高度可扩展性而受到...

    Flask学习笔记(10)源码

    在本篇Flask学习笔记(10)中,我们将深入探讨Python Web开发框架Flask的高级用法和核心概念。Flask是一个轻量级、灵活的框架,它以简洁的API和可扩展性赢得了开发者们的喜爱。让我们一起探索Flask的魅力。 首先,`...

    python学习笔记,100天

    【Python学习笔记,100天】是一份全面且深入的Python编程教程,旨在帮助初学者和有一定基础的开发者在100天内系统地掌握Python语言的核心概念和技术。这份笔记可能包含了从基础语法到高级特性的详尽讲解,通过每一天...

    Flask学习笔记8源码

    **Flask学习笔记8源码解析** 在Python的Web开发领域,Flask是一个轻量级且灵活的框架,因其简洁的API和强大的扩展性而受到开发者喜爱。本篇笔记将深入探讨Flask的核心概念和常见用法,通过分析"demo8"这个压缩包中...

    老男孩python全栈开发学习笔记.zip_Python全栈_harborkyi_python 全栈开发_全栈_老男孩 pyth

    《老男孩Python全栈开发学习笔记》是一部针对Python开发者进阶至全栈开发的重要学习资料。这份压缩包包含了作者harborkyi对于Python全栈开发的深入理解和实践总结,尤其适合那些希望提升自身技能,从单一领域跨越到...

    FLask学习笔记(2)源码demo2.rar

    **FLask学习笔记(2)源码分析** 在Python Web开发领域,Flask是一个轻量级、灵活且强大的Web框架。本笔记将深入探讨在Flask框架中进行开发的一些核心概念和技术,通过分析"demo2"这个源码实例,帮助读者更深入地...

    Python学习笔记都(是干货).zip

    这份"Python学习笔记都(是干货).zip"压缩包显然包含了深入的Python学习资源,特别是以PDF格式的笔记形式呈现。以下是一些可能涵盖的重要Python知识点: 1. **基础语法**:Python的基础语法包括缩进、变量声明、...

    PyQt学习笔记-使用通用数据库接口QtSql操作SQLite数据库

    这篇学习笔记将深入探讨如何使用PyQt的QtSql模块来操作SQLite数据库。 首先,你需要确保已经安装了PyQt5和包含SQLite支持的SQLAlchemy库。安装命令通常是: ``` pip install PyQt5 pip install sqlalchemy ``` 接...

Global site tag (gtag.js) - Google Analytics