V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
skyduy
V2EX  ›  Python

基于 sqlalchemy 造了一个易用的小型 ORM 轮子

  •  
  •   skyduy ·
    skyduy · 2020-01-13 11:03:51 +08:00 · 2153 次点击
    这是一个创建于 1779 天前的主题,其中的信息可能已经有所发展或是发生改变。

    源码

    https://github.com/skyduy/dblink

    安装:pip install dblink

    特性

    • 可以对现有数据库连接,方便在各种场景使用
    • 简单易用,接口类似 Django-ORM
    • 支持批量增删改查

    简介

    假设数据库中有两张已存在的表usersaddress:

    CREATE TABLE users (
        id INTEGER NOT NULL,
        name VARCHAR(50),
        fullname VARCHAR(50),
        password VARCHAR(12),
        PRIMARY KEY (id)
    );
    
    CREATE TABLE addresses (
        id INTEGER NOT NULL,
        email_address VARCHAR NOT NULL,
        user_id INTEGER,
        PRIMARY KEY (id),
        FOREIGN KEY(user_id) REFERENCES users (id)
    );
    

    你可以使用 Database Urls 进行连接数据库。

    from dblink import Database, Table
    # 手动关闭连接
    db = Database(url='sqlite:///:memory:')
    user_table = Table('users', db)
    # 增删改查操作
    db.close()
    
    # 推荐使用 with 自动管理
    with Database(url='postgresql://scott:tiger@localhost/mydatabase') as db:
        address_table = Table('addresses', db)
        # 增删改查操作
    

    下面是使用例子

    """
    Suppose you have two table: users and addresses.
    """
    from dblink import Database, Table
    
    
    with Database('sqlite:///:memory:') as db:
        table_user = Table('users', db)
        table_address = Table('addresses', db)
    
        # show description
        print(table_user.description)
        print(table_address.description)
    
        # chain query, you can call delete on the single table result
        table_user.query.filter(id=1).one_or_none()
    
        table_user.query.filter(id__gte=2) \
                        .order_by('name') \
                        .values_list('id', 'name')
    
        table_user.query.filter(id__in=[1, 2, 3]) \
                        .filter(name__startswith='Yu').all()
    
        table_user.query.order_by('-name') \
                        .values_list('fullname', flat=True, distinct=True)
    
        table_user.query.distinct('name').values_list('name', flat=True)
    
        table_user.query.filter(id__in=[1, 2, 3]).delete()
    
        # join query
        table_user.join(table_address) \
                  .filter(id__lt=10000) \
                  .filter(email_address__contains='gmail') \
                  .filter(**{'addresses.id__gte': 100}) \
                  .values_list('user_id', 'name', 'email_address',
                               table_address.id, 'users.fullname')
    
        # get or insert
        instance, create = table_user.get_or_insert(id=1, name='jone')
    
        # single record operation.
        table_user.insert({'id': 1, 'name': 'XiaoHong', 'password': 'psw'})
    
        table_user.update({'id': 1, 'name': 'skyduy', 'password': 'psw'},
                          unique_fields=['id'], update_fields=['name', 'password'])
    
        table_user.insert_or_update(
            {'id': 1, 'name': 'skyduy', 'password': 'psw'},
            unique_fields=['id'], update_fields=['name', 'password']
        )
    
        table_user.delete({'id': 1, 'name': "I don't matter"},
                          unique_fields=['id'])
    
        # bulk operation
        items = [{'id': 1, 'name': 'XiaoHong', 'password': 'haha'},
                 {'id': 2, 'name': 'skyduy', 'password': 'aha'},]
        unique_fields = ['id']
        update_fields = ['name']
        table_user.bulk_insert(items)
        table_user.bulk_delete(items, unique_fields)
        table_user.bulk_update(items, unique_fields, update_fields)
        table_user.bulk_insert_or_update(items, unique_fields, update_fields)
    
    3 条回复    2020-01-13 18:48:51 +08:00
    qile1
        1
    qile1  
       2020-01-13 13:42:15 +08:00 via Android
    支持微软数据库 mssql 不?不是 mysql,sqlserver 那种的好像查询不一样!
    CallMeReznov
        2
    CallMeReznov  
       2020-01-13 14:02:50 +08:00
    sqllite 默认的库一般讲道理需求和写起来都比较容易实现,主要痛点还在于多线程的连接池管理上
    我前几天直接就是用的自带的库,也就一个线程就疯狂报错
    最后还是上了 PersistentDB
    skyduy
        3
    skyduy  
    OP
       2020-01-13 18:48:51 +08:00
    @qile1
    因为这个是基于 SQLAlchemy 封装的,所以支持。

    更改 Database URL 即可,详见: https://docs.sqlalchemy.org/en/13/core/engines.html#microsoft-sql-server
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3141 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 13:30 · PVG 21:30 · LAX 05:30 · JFK 08:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.