# encoding: utf8
import sys
+import sqlalchemy.types
+
from .db import connect, metadata
def main():
metadata.create_all()
+ # Oh, mysql-chan.
+ # TODO try to insert data in preorder so we don't need this hack and won't
+ # break similarly on other engines
+ if 'mysql' in engine_uri:
+ session.execute('SET FOREIGN_KEY_CHECKS = 0')
+
# This is a secret attribute on a secret singleton of a secret class that
# appears to hopefully contain all registered classes as keys.
# There is no other way to accomplish this, as far as I can tell.
print table_name
reader = csv.reader(open("%s/%s.csv" % (dir, table_name), 'rb'), lineterminator='\n')
- columns = [unicode(column) for column in reader.next()]
+ column_names = [unicode(column) for column in reader.next()]
for csvs in reader:
row = table()
- for column, value in zip(columns, csvs):
- value = value.decode('utf-8')
- setattr(row, column, value)
+ for column_name, value in zip(column_names, csvs):
+ column = table.__table__.c[column_name]
+ if column.nullable and value == '':
+ # Empty string in a nullable column really means NULL
+ value = None
+ elif isinstance(column.type, sqlalchemy.types.Boolean):
+ # Boolean values are stored as string values 0/1, but both
+ # of those evaluate as true; SQLA wants True/False
+ if value == '0':
+ value = False
+ else:
+ value = True
+ else:
+ # Otherwise, unflatten from bytes
+ value = value.decode('utf-8')
+
+ setattr(row, column_name, value)
session.add(row)
session.commit()
+ # Shouldn't matter since this is usually the end of the program and thus
+ # the connection too, but let's change this back just in case
+ if 'mysql' in engine_uri:
+ session.execute('SET FOREIGN_KEY_CHECKS = 1')
+
def csvexport(engine_uri, dir='.'):
import csv