我编写了一个 Python 2.7 刮板,但在尝试保存我的数据时出现错误。刮板是用Scraperwiki编写的,但我认为这与我得到的错误在很大程度上无关 - 在 Scraperwiki 中保存似乎是使用 Sqlalchemy 处理的,正是这个导致了错误。
我收到此错误消息:
Traceback (most recent call last):
File "./code/scraper", line 192, in <module>
saving(spreadsheet_pass)
File "./code/scraper", line 165, in saving
scraperwiki.sql.save(["URN"], school, "magic")
File "/usr/local/lib/python2.7/dist-packages/scraperwiki/sql.py", line 195, in save
connection.execute(insert.values(row))
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 729, in execute
return meth(self, multiparams, params)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/elements.py", line 321, in _execute_on_connection
return connection._execute_clauseelement(self, multiparams, params)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 826, in _execute_clauseelement
compiled_sql, distilled_params
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 893, in _execute_context
None, None)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1160, in _handle_dbapi_exception
exc_info
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/compat.py", line 199, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 889, in _execute_context
context = constructor(dialect, self, conn, *args)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py", line 573, in _init_compiled
param.append(processors[key](compiled_params[key]))
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/processors.py", line 56, in boolean_to_int
return int(value)
sqlalchemy.exc.StatementError: invalid literal for int() with base 10: 'n/a' (original cause: ValueError: invalid literal for int() with base 10: 'n/a') u'INSERT OR REPLACE INTO magic (published_recent, inspection_rating2, schooltype, "LA", "URL", "URN", schoolname, open_closed, opendate_full, inspection_rating, opendate_short, phase, publication_date, include, notes, inspection_date) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' []
尝试保存这行数据时:
{u'published_recent': 'n/a', u'inspection_rating2': 'n/a', u'schooltype': u'Free school', u'LA': u'Tower Hamlets', u'URL': u'http://www.ofsted.gov.uk/inspection-reports/find-inspection-report/provider/ELS/138262', u'URN': u'138262', u'schoolname': u'City Gateway 14-19 Provision', u'open_closed': u'Open', u'opendate_full': u'2012-09-03', u'inspection_rating': 'No section 5 inspection yet', u'opendate_short': u'September 2012', u'phase': u'Alternative provision', u'publication_date': 'n/a', u'include': False, u'notes': 'test message', u'inspection_date': 'n/a'}
使用这行代码:
scraperwiki.sql.save(["URN"], school, "magic")
(在 Scraperwiki 中,使用键 'URN' 作为唯一键,将 'school' 字典中的数据保存到名为 'magic' 的数据库中。)
奇怪的是,有时刮板工作正常,我没有得到错误,但其他时候,运行相同的代码,我得到这个错误。
我尝试过的事情:
- 清除我要保存到的数据库,或使用不同的名称启动一个新数据库。都没有奏效。
- 编辑正在保存的数据。该错误是指针对键“published_recent”保存的“n/a”值存在问题。前几行数据,保存没有问题,包含布尔类型的数据,所以我认为字符串由于某种原因造成了困难。将值更改为整数意味着我没有收到此错误。现在我无法复制它(当值为整数时,保存似乎有效),但我认为当我尝试将“published_recent”值更改为数据行的整数时收到此错误这似乎给我带来了问题:
sqlalchemy.exc.IntegrityError: (IntegrityError) constraint failed
无论哪种方式,这都不是真正的解决方案,因为我需要能够保存一个字符串。
- 阅读有关这两个错误的所有 StackOverflow 问题以及 sqlalchemy 文档。我找不到任何似乎可以解决我遇到的问题的东西。
- 对数据使用 Autoincrementing 键。我将数据保存在唯一的键“URN”上,但我认为刮板可能在出于某种原因保存时使用“published_recent”键作为唯一键,所以我尝试使用自动递增键,如下答案:ScraperWiki:如何使用自动增量键创建和添加记录。仍然得到同样的错误。
提前感谢您的任何答案 - 这让我有点发疯。