`

sqlalchemy如何分表

阅读更多

       

背景

话说sqlalchemy真是一个非常好用的库,python orm基本上是舍我其谁了,文档还非常全面,基本上没有什么硬伤,现在也冲出了1.0版本,未来更加值得期待。
我最早用django orm,不过很快就觉得很多功能不够用,我当时用的版本是1.3.1,没有bulk insert也没有,没有这两个功能,好多应用就没法用django开发了。之后开始接触sqlalchemy,一直用到现在,总的体会是只有你想不到没有它做不到。

我们项目里有一个需求,就是数据按月分表,比如:2014年6月数据就存在record_201406表中, 其他月数据按此方法类推。这个需求如果是用sqlalchemy来获取数据,我们怎么做呢?

一般方法有什么问题?

一般情况下,我们很自然想到使用如下方法:

1
2
3
4
5
class RecodeDao_201406(Base):
   	__tablename__ = 'record_201406'
   	id = Column(INT(11), primary_key=True)
   ...

或者简化点:

1
2
3
4
class RecodeDao_201406(Base):
   	__table__ = Table('record_201406',
       Base.metadata, autoload=True)

这样实现确实没问题,但回到需求上,既然是按月分表,难不成我要每个月写一个这样的model?每月上次线?当然不行,那我们怎么解决呢?

官网解决方法,有什么问题?

有经验的同学可能发现,这个不就是水平sharding么?这么说不完全对,看一下sharding的wiki定义:

A database shard is a horizontal partition of data in a database or search engine. Each individual partition is referred to as a shard or database shard. Each shard is held on a separate database server instance, to spread load.

我们这个需求只涉及单数据库,就不算sharding了,可以称为partitioning(分区),然而强大的sqlalchemy这两个情况都考虑到了,并且官网都提供了example,我们挑对应场景的partitioning出来看看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class TBase(object):
    """Base class is a 'mixin'.

    Guidelines for declarative mixins is at:

    http://www.sqlalchemy.org/docs/orm/extensions/declarative.html#mixin-classes

    """
    id = Column(Integer, primary_key=True)
    data = Column(String(50))

    def __repr__(self):
        return "%s(data=%r)" % (
            self.__class__.__name__, self.data
        )

class T1Foo(TBase, Base):
    __tablename__ = 't1'

class T2Foo(TBase, Base):
    __tablename__ = 't2'

    timestamp = Column(DateTime, default=func.now())

engine = create_engine('sqlite://', echo=True)

Base.metadata.create_all(engine)

sess = sessionmaker(engine)()

sess.add_all([T1Foo(data='t1'), T1Foo(data='t2'), T2Foo(data='t3'),
             T1Foo(data='t4')])

print sess.query(T1Foo).all()
print sess.query(T2Foo).all()

使用了继承的方法,抽象的好,但我们之前的问题解决了吗?没有。还是需要预定义好所有表的model类,才能正确使用,迫不得已,我们只能自己想办法了。

函数方法解决

经过一番探索,我得出了如下方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class_registry = {}                                                                                                                                                                    
DbBase = declarative_base(bind=engine, class_registry=class_registry)

def get_model(modelname, tablename, metadata=DbBase.metadata):
    """
        args:
            modelname:新model名,string类型
            tablename:数据库中表名
        usage:
          RecordDao = get_model("RecordDao_201406", "record_201406")
    """
    if modelname not in class_registry: 
        model = type(modelname, (DbBase,), dict(
            __table__ = Table(tablename, metadata, autoload=True)
        ))  
    else:
        model = class_registry[modelname]
return model

每次想获取对应月表数据的model,调用get_model方法即可。这个方法一直沿用到现在,虽然有点丑陋,但却是解决了以上问题。直到sqlalchemy 0.9.1版本推出Automap

Automap方法

sqlalchemy文档完备,具体可点击Automap,它可以自动映射数据库的表,通过数据表名映射model,简单直接,实现起来如下:

1
2
3
4
5
6
7
8
from sqlalchemy.ext.automap import automap_base

AutoBase = automap_base()
# reflect the tables
AutoBase.prepare(engine, reflect=True)
tablename = "record_201406"
RecordDao = getattr(AutoBase.classes, tablename)

这样就可以了,很清晰。但是这个方法有一个缺点,Automap的映射虽然是自动的,但是只有在启动的时候生效,也就是说如果新建一个数据表,而没有告诉Automap,那这个表是找不到的。在实际使用中,可以捕获AttributeError异常,并再次调用AutoBase.prepare(engine, reflect=True) 刷新映射关系。

分享到:
评论

相关推荐

    Python+MySQL分表分库实战

    此外,`sqlalchemy`是一个更高级的ORM(对象关系映射)框架,可以方便地进行数据库操作,支持复杂的查询和事务管理。 2. **数据迁移与同步**:在分表分库后,数据迁移和表结构同步是关键。Python可以编写脚本,通过...

    sqlalchemy documentation sqlalchemy 文档

    根据提供的文档信息,我们可以归纳出一系列关于SQLAlchemy的知识点,主要涵盖了概述与安装、对象关系映射教程、SQL表达式语言教程以及映射器配置等内容。以下是对这些知识点的详细阐述: ### 概述与安装 #### 1.1 ...

    FlaskSQLAlchemy下载及安装

    **Flask-SQLAlchemy**是Python微框架Flask的一个扩展,它使得在Flask应用中集成和使用SQLAlchemy变得更加方便。SQLAlchemy是Python的一个强大的ORM(对象关系映射)库,能够将数据库操作转化为面向对象的编程方式。...

    SQLAlchemy技术文档(中文版)

    ### SQLAlchemy技术文档(中文版)知识点总结 #### 1. 版本检查 - **功能说明**:在使用SQLAlchemy之前,确保安装的版本符合项目需求是非常重要的。可以通过导入SQLAlchemy包并调用`__version__`属性来检查当前安装的...

    Python利用flask sqlalchemy实现分页效果

    ### 使用Flask-SQLAlchemy实现分页效果 #### 引言 在Web开发中,当数据量较大时,为了提高用户体验以及减轻服务器负担,通常会采用分页技术展示数据。Flask-SQLAlchemy是一个非常流行的扩展,它为Flask框架提供了...

    SQLAlchemy

    SQLAlchemy是一种流行的ORM(对象关系映射)工具,它在Python社区中被广泛使用,特别是在数据库操作和管理方面。ORM工具的主要目的是将数据库中的数据表结构映射到编程语言中的对象模型,允许开发者使用更加面向对象...

    sqlalchemy

    SQLAlchemy是一个功能强大的Python库,用于与关系型数据库进行交互,其最突出的特点是具有对象关系映射(ORM)功能。它提供了完善的工具集,让开发者能够以面向对象的方式操作数据库,而不是写原始SQL代码,极大地...

    sqlalchemy文档资料翻译

    ### SQLAlchemy文档资料翻译知识点 #### 一、概述与核心组件 - **SQLAlchemy**:一套成熟且全面的Python库,用于实现与多种数据库系统的交互。它不仅提供了强大的ORM(对象关系映射)功能,还拥有独立于ORM之外的...

    Python库 | SQLAlchemy-1.4.0b1.tar.gz

    SQLAlchemy 是一个强大的 Python SQL 工具包和 ORM(对象关系映射)系统,它提供了对多种数据库引擎的全面支持,包括 PostgreSQL、MySQL、SQLite 和 Microsoft SQL Server 等。在 Python 中,SQLAlchemy 为开发者...

    SQLAlchemy 1.1 Documentation

    SQLAlchemy 1.1 Documentation

    sqlalchemy-utils, Sqlalchemy的各种实用程序函数和数据类型.zip

    Sqlalchemy-utils是一个强大的Python库,它是为SQLAlchemy这个流行的ORM(对象关系映射)框架提供额外功能和实用工具的扩展。SQLAlchemy是Python中的一个核心数据库接口,它允许开发者使用面向对象的方式来操作...

    SQLAlchemy最新英文文档

    SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行。 SQLAlchemy“采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”...

    Python SQLAlchemy入门教程(基本用法)

    标题“Python SQLAlchemy入门教程(基本用法)”表明本文档是一份面向初学者的教程,旨在介绍如何使用Python中的SQLAlchemy库来进行数据库操作。SQLAlchemy是一个流行的对象关系映射(ORM)工具,它允许开发者通过...

    PyPI 官网下载 | sqlalchemy_cockroachdb-1.3.0-py3-none-any.whl

    **PyPI 官网下载 | sqlalchemy_cockroachdb-1.3.0-py3-none-any.whl** PyPI(Python Package Index)是Python社区官方的软件包仓库,提供了大量Python库供开发者下载和使用。在给定的资源中,我们关注的是`...

    SQLAlchemy最新权威详细教程

    SQLAlchemy 最新权威详细教程 SQLAlchemy 是一个 Python SQL 工具库,提供了一个高级的对象关系映射(Object-Relational Mapping,ORM)系统,能够与多种关系型数据库管理系统(RDBMS)集成,例如 MySQL、Oracle、...

    Python-awesomesqlalchemy系列SQLAlchemy相关工具集合

    **Python-awesomesqlalchemy系列SQLAlchemy相关工具集合** SQLAlchemy是Python中的一款强大的对象关系映射(ORM)框架,它允许开发者使用Python类来操作数据库,极大地简化了数据库操作。这个`awesome-sqlalchemy`...

    SQLAlchemy详细教程

    SQLAlchemy 详细教程 SQLAlchemy 是一个 Python 的关系型数据库工具包,提供了一个高级的对象关系映射(Object-Relational Mapping,ORM)系统,允许开发者使用 Python 对象来交互数据库,而不需要直接使用 SQL ...

Global site tag (gtag.js) - Google Analytics