pythonDjango比较数组与Mod

2024-10-02 00:28:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Oracle数据库,我不能在里面添加新的表,因此在Django上我创建了一个sqlite数据库,基本上只是为了将Oracle数据库中的项目同步到sqlite。在

目前Oracle数据库中有大约50万个条目。在

Oracle数据库中的所有主键都是增量的,但是不能保证。当数据库和数据库之间的连接丢失时,我有时会丢失数据库和数据库之间的连接。在

因此,我在Django内部设计了一个模型:

class sequential_missing(models.Model):
    database = models.CharField(max_length=200, primary_key=True)
    row = models.IntegerField(primary_key=True)

基本上在数据库中有一行,在Oracle端是丢失的,我将比较sqlite数据库中丢失的序列号,并找出缺少的序列号在Oracle数据库中实际上是空的。因此,加快了不实际检查所有缺失的序列值的过程。在

整个功能如下:

^{pr2}$

代码分为3部分:

  1. 找出丢失的序列值

  2. 如果模型和p值之间有匹配的话

  3. 创建一个不包含第2节中包含的行的新数组。

问题是第2节花费了很长的时间O(n^2),因为它必须遍历整个数据库并检查该行最初是否为空。在

有没有一种更快的方法,同时消耗最少的内存?在

编辑:

使用ROW-IN更好

setItem = []
for items in missingValues:
    setItem.append(items)
print "Items in setItem:" + str(len(setItem))

currentCounter = 0
currentEndCounter = 500
counterIncrement = 500
emptyRowAppend = []
end = False
firstPass = False
while(end == False):
    emptyRow = sequential_missing.objects.filter(database=databaseName, row__in = setItem[currentCounter:currentEndCounter])
    for items in emptyRow:
        emptyRowAppend.append(items.row)
    if(firstPass == True):
        end = True
    if ((currentEndCounter+counterIncrement)>maxValue):
        currentCounter += counterIncrement
        currentEndCounter = maxValue
        firstPass = True
    else:
        currentCounter += counterIncrement
        currentEndCounter += counterIncrement


print "Removing empty numbers," + "Empty Row Append Size:" + str(len(emptyRowAppend)) + ", Missing Value Size:" + str(len(missingValues)) + ", Set Item Size:" + str(len(setItem)) +  ", Empty Row:" + str(len(emptyRowAppend))
missingValuesCompared = []
for idx, val in enumerate(missingValues):
    found = False
    for items in emptyRowAppend:
        if(val == items):
            found = True
            break
    if(found == False):
        missingValuesCompared.append(val)

Tags: in数据库falsetrueforlenifitems
1条回答
网友
1楼 · 发布于 2024-10-02 00:28:28

您可以替换此代码

emptyRow = []
for idx, val in enumerate(missingValues):
    found = False
    for items in sequential_missing.objects.all():
        if(items.row == val and items.database == databaseName):
            found = True
            #print "Database:" + str(items.row) + ", Same as Empty Row:" + str(val)
    if(found == True):
        emptyRow.append(val)

^{pr2}$

以便向数据库发出单个查询。但是,这将连接字符串中所有丢失的值,该字符串必须插入查询中。你应该试试看是否可行。在

否则,您应该同时订购缺失值和顺序_缺少.objects通过val,这样你就可以在线性时间内找到项目。比如:

sort(missingValues)
val_index = 0
for item in sequential_missing.objects.all().order_by('row'):
  while (val_index < len(missingValues) and item.row>missingValues[val_index]):
    val_index += 1
  if (item.row == missingValues[val_index]): 
    emptyRow.append(item.row)

相关问题 更多 >

    热门问题