首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将teradata数据库与django模型框架集成

将teradata数据库与django模型框架集成
EN

Stack Overflow用户
提问于 2019-09-03 15:25:54
回答 1查看 602关注 0票数 0

我们有一个外部的teradata数据库,我们希望创建一个使用django生成和查询的前端。

在使用到DB的直接ODBC连接和运行查询并在网站上显示查询方面,我已经取得了相当大的进步,但我越深入,就越明显需要使用django模型框架。

我的问题是,是否有人有经验或洞察力,在如何将teradata集成到django web应用程序中?

例如,我使用django-table 2显示数据,因为它不仅允许使用查询集生成表,而且还允许使用对我非常有用的字典列表。现在,我已经开始使用django-filters包添加筛选,而且它似乎只能使用queryset对象而不是其他任何东西来完成。

如果你能提供任何建议,我将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-04 17:28:11

这里是我为Django应用程序所构建的“数据库实用程序”库。后端是Postgres,但它应该适合Teradata。

看看get_data_qs()函数中的逻辑。这就是我用来使用QuerySets过滤器技巧创建__in的方法,它应该将结果集转换为QuerySet。不知道这能让你走多远,但你可以玩点什么。

dbUtils.py

代码语言:javascript
复制
from django.db import connection
from collections import namedtuple

# TO-DO: Handle non-ASCII characters (Python default encoding is ASCII)

# Return data as a RawQuerySet object (list of objects)
def get_data(myobjects, sp_signature, params):
    # IMPORTANT: Model field names must match column names in DB
    resultset = myobjects.raw('select 1 as id, * from ' + sp_signature, params)

    # Check if resultset has any rows
    try:
        test = resultset[0] 
    except IndexError:
        return myobjects.none() # return empty queryset ("not myobjects.none()" == True)

    # Return result set
    return resultset

# Return data as a single model object
def get_data_pk(myobjects, sp_signature, params):
    resultset = get_data(myobjects, sp_signature, params)

    # If there is a result set, return the first instance
    if(resultset):
        return resultset[0] 

# Return data as a QuerySet object (first column in resultset must be the model PK
def get_data_qs(self, sp_signature, params, pk_fieldname = None):
    cursor = connection.cursor()
    try:
        # Use default PK if not provided
        if(not pk_fieldname):
            pk_fieldname = self.model._meta.pk.name

        # Create "IN" filter
        myfilter = pk_fieldname + '__in' 

        # Execute query and apply filter to convert to QuerySet        
        cursor.execute("select * from " + sp_signature, params)
        return self.filter(**{ myfilter: (x[0] for x in cursor) }) 
          # TO-DO: This (**) may need looking at due to Python 3 conversion

    finally:
        cursor.close()

# Return data as a non-objectified result set (list of rows)
def get_data_raw(sp_name, params):
    with connection.cursor() as cursor:        
        cursor.callproc(sp_name, params)
        return_data = namedtuplefetchall(cursor) # Format as result set (list of tuples)
        cursor.close()

    return return_data

def save_data(sp_name, params):
    with connection.cursor() as cursor:        
        cursor.callproc(sp_name, params)
        return_data = cursor.fetchone() # Store any output
        cursor.close()

    return return_data

# Return all rows from a cursor as named tuples (i.e. rows with field names)
def namedtuplefetchall(cursor):
    columns = [col[0] for col in cursor.description]
    nt_result = namedtuple('Result', columns)

    return [
        nt_result(*row) 
        for row in cursor.fetchall()
    ]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57774698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档