我们有一个外部的teradata数据库,我们希望创建一个使用django生成和查询的前端。
在使用到DB的直接ODBC连接和运行查询并在网站上显示查询方面,我已经取得了相当大的进步,但我越深入,就越明显需要使用django模型框架。
我的问题是,是否有人有经验或洞察力,在如何将teradata集成到django web应用程序中?
例如,我使用django-table 2显示数据,因为它不仅允许使用查询集生成表,而且还允许使用对我非常有用的字典列表。现在,我已经开始使用django-filters包添加筛选,而且它似乎只能使用queryset对象而不是其他任何东西来完成。
如果你能提供任何建议,我将不胜感激!
发布于 2019-09-04 17:28:11
这里是我为Django应用程序所构建的“数据库实用程序”库。后端是Postgres,但它应该适合Teradata。
看看get_data_qs()函数中的逻辑。这就是我用来使用QuerySets过滤器技巧创建__in的方法,它应该将结果集转换为QuerySet。不知道这能让你走多远,但你可以玩点什么。
dbUtils.py
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()
]https://stackoverflow.com/questions/57774698
复制相似问题