从数据库执行python代码时出现语法错误

从数据库执行python代码时出现语法错误,python,exec,Python,Exec,我正在从数据库加载一些python代码(它正在动态映射我可以在运行时更改的值,而无需重新部署代码) 在我的代码中,我这样做是为了执行数据库代码: if lMapping: print lMapping exec lMapping lValue = mapping(lValue, lCsvRow) 下面是lMapping的价值: def mapping(pValue, pCsvRow): lInterimStatus = pCsvRow[5] lOutComeStatus =

我正在从数据库加载一些python代码(它正在动态映射我可以在运行时更改的值,而无需重新部署代码)

在我的代码中,我这样做是为了执行数据库代码:

if lMapping:
  print lMapping
  exec lMapping
  lValue = mapping(lValue, lCsvRow)
下面是lMapping的价值:

def mapping(pValue, pCsvRow):
  lInterimStatus = pCsvRow[5]
  lOutComeStatus = pCsvRow[6]

  if len(lInterimStatus) == 0:
    lStatus = lOutComeStatus
  else:
    lStatus = lInterimStatus

  lStatus = lStatus.lower()

  PRIMARY_STATUS_MAPPINGS = {
    'completed with lender' : '4828',
    'not taken up' : '4827',
    'declined across all lenders' : '4726',
    'declined broker duplicate' : '4726',
    'pending' : '4725',
    'pending (in progress with broker)' : '4725',
    'pending (in progress with lender)' : '4725',
    'lender accept in principle' : '4827',
    'lender decline duplicate' : '4743',
    'lender decline post code not supported' : '4743',
    'lender decline score fail' : '4743',
    'lender decline policy fail' : '4743',
    'lender decline no client contact' : '4743',
    'lender decline general' : '4743',
    'lender decline bad data' : '4743',
  }

  return PRIMARY_STATUS_MAPPINGS[lStatus]
每当我执行此操作时,我都会在exec行上出现语法错误,我无法找出原因:

(:无效语法(,第1行)

更新 如果我先将数据库中的代码写入文件,它就会工作:

print lMapping
lFile = open('/mapping.py','w')
lFile.write(lMapping)
lFile.close()
lReadFile = open('/mapping.py')
exec lReadFile
lValue = mapping(lValue, lCsvRow)
是否使用BLOB或其他二进制类型列来存储代码?否则,数据库可能会更改行尾,exec将中断,并出现
SyntaxError

>>> s='''\
... print 'ok'
... '''
>>> s
"print 'ok'\n"
>>> exec s
ok
>>> exec s.replace('\n', '\r\n')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    print 'ok'
              ^
SyntaxError: invalid syntax

将此字符串复制到my python interactive并执行您的代码似乎没有问题。可能您在其他地方遇到了其他问题。对我来说,这似乎是一个糟糕的设计。最好使用python pickle存储值。然后将pickle存储在数据库或文件中。您是否可以发布
repr(lMapping)
在存储到数据库之前和从数据库中检索之后?需要考虑的事项:1.尝试“打印报告(lMapping)”相反,请检查它,或向我们展示,以及2.向我们展示完整的回溯。您所展示的似乎不是正常的回溯,因此您还涉及到其他代码。我认为您有错误的行尾的建议可能是正确的。可能是“\n”。join(lMapping.splitlines())这将是一个很好的尝试步骤……但是数据库中的值是python代码。上面的示例只是一个可能的映射,其他示例可能只是将传入的值大写并返回它。我没有开发DSL,而是将python放入数据库中。这个特定的映射非常复杂,因为它需要查看两个不同的字段(来自第三方CSV文件)计算返回内容。其他人将获取一个值并返回它。使用代码提供了更大的灵活性。该表由django,NVARCHAR2(2000)创建。这是一个oracle数据库。正如您所建议的,它只在行末尾,但您的解决方案只能在os.linesep为“\n”的位置工作。我正在windows上开发并在solaris上部署,因此我通过执行lMapping=lMapping.replace(“\r\n”,““\n”)来修复它。谢谢。
lMapping = os.linesep.join(lMapping.splitlines())