I have written a script to parse a large xml file and insert the contents
in to my app db. I am using lxml.
After about 10 records get inserted, the script fails with
<type 'exceptions.TypeError'> argument of type 'NoneType' is not iterable
Troubleshooting determined the following:
1. This error is associated with 3 list:reference fields. When I remove
them from the script, the script executes uneventfully. If any one of them
is included, it fails.
2. This only happens after 10 records have been successfully inserted.
3. There is no discernible difference between the records that get
successfully added and those that don't. The error happens even when I hard
code the lists for the list:reference field. It seems to be associated with
number of records, rather than which records.
4. The script executes successfully when I change the field types from
'list:reference' to 'string' and insert strings instead of lists. You
should not assume from this that there is a data issue. As I said,
hardcoded lists get rejected also. I am 99% certain valid data is not the
issue.
5. This happens in both SQLLite and Postgres
Here is the model declaration for one of the three fields. They are all
analogous:
Field('genres','string','list:reference genre', requires=IS_IN_DB(db,
'genre.id', '%(name)s [%(id)s]', multiple=True))
Here is how I update each new row in the the database:
db.movies.validate_and_insert(**movie) (movie is a dict)
Here is how I hardcoded values into the fields: movie['genre'] = {456, 368,
239]
Now, if someone doesn't have a solution, can they tell me if I can
1.Programmatically remove the list:reference from the model prior to data
updates and programmatically restore it afterwards?
2. Retain all the functionality of these fields by toggling this way?
Seriously considering going the join table route and skipping the list
reference fields. Are there any gotchas there?
--