Fixed some MySQL import problems.
authorEevee <git@veekun.com>
Sun, 8 Mar 2009 02:54:01 +0000 (18:54 -0800)
committerEevee <git@veekun.com>
Sun, 8 Mar 2009 02:54:01 +0000 (18:54 -0800)
Tables weren't being defined as UTF-8 if that wasn't the server default.

A lot of tables were trying to create erroneous auto_increment columns.

Foreign key checks were pretty much fucking everything up.

pokedex/__init__.py
pokedex/db/__init__.py
pokedex/db/tables.py

index 138c58b..17e982d 100644 (file)
@@ -27,6 +27,12 @@ def csvimport(engine_uri, dir='.'):
 
     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.
@@ -50,6 +56,11 @@ def csvimport(engine_uri, dir='.'):
 
         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
index 0641391..c9b739d 100644 (file)
@@ -15,9 +15,11 @@ def connect(uri):
         if 'charset' not in uri:
             uri += '?charset=utf8'
 
-        # Tables should be InnoDB, in the event that we're creating them
+        # Tables should be InnoDB, in the event that we're creating them, and
+        # use UTF-8 goddammit!
         for table in metadata.tables.values():
             table.kwargs['mysql_engine'] = 'InnoDB'
+            table.kwargs['mysql_charset'] = 'utf8'
 
     ### Connect
     engine = create_engine(uri)
index 4c38755..7bf30c4 100644 (file)
@@ -114,31 +114,31 @@ class Pokemon(TableBase):
 
 class PokemonAbility(TableBase):
     __tablename__ = 'pokemon_abilities'
-    pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False)
+    pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
     ability_id = Column(Integer, ForeignKey('abilities.id'), nullable=False)
-    slot = Column(Integer, primary_key=True, nullable=False)
+    slot = Column(Integer, primary_key=True, nullable=False, autoincrement=False)
 
 class PokemonDexNumber(TableBase):
     __tablename__ = 'pokemon_dex_numbers'
-    pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False)
-    generation_id = Column(Integer, ForeignKey('generations.id'), primary_key=True, nullable=False)
+    pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
+    generation_id = Column(Integer, ForeignKey('generations.id'), primary_key=True, nullable=False, autoincrement=False)
     pokedex_number = Column(Integer, nullable=False)
 
 class PokemonEggGroup(TableBase):
     __tablename__ = 'pokemon_egg_groups'
-    pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False)
-    egg_group_id = Column(Integer, ForeignKey('egg_groups.id'), primary_key=True, nullable=False)
+    pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
+    egg_group_id = Column(Integer, ForeignKey('egg_groups.id'), primary_key=True, nullable=False, autoincrement=False)
 
 class PokemonFlavorText(TableBase):
     __tablename__ = 'pokemon_flavor_text'
-    pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False)
-    version_id = Column(Integer, ForeignKey('versions.id'), primary_key=True, nullable=False)
+    pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
+    version_id = Column(Integer, ForeignKey('versions.id'), primary_key=True, nullable=False, autoincrement=False)
     flavor_text = Column(Unicode(255), nullable=False)
 
 class PokemonName(TableBase):
     __tablename__ = 'pokemon_names'
-    pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False)
-    language_id = Column(Integer, ForeignKey('languages.id'), primary_key=True, nullable=False)
+    pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
+    language_id = Column(Integer, ForeignKey('languages.id'), primary_key=True, nullable=False, autoincrement=False)
     name = Column(Unicode(16), nullable=False)
 
 class PokemonShape(TableBase):
@@ -149,16 +149,16 @@ class PokemonShape(TableBase):
 
 class PokemonStat(TableBase):
     __tablename__ = 'pokemon_stats'
-    pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False)
-    stat_id = Column(Integer, ForeignKey('stats.id'), primary_key=True, nullable=False)
+    pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
+    stat_id = Column(Integer, ForeignKey('stats.id'), primary_key=True, nullable=False, autoincrement=False)
     base_stat = Column(Integer, nullable=False)
     effort = Column(Integer, nullable=False)
 
 class PokemonType(TableBase):
     __tablename__ = 'pokemon_types'
-    pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False)
+    pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
     type_id = Column(Integer, ForeignKey('types.id'), nullable=False)
-    slot = Column(Integer, primary_key=True, nullable=False)
+    slot = Column(Integer, primary_key=True, nullable=False, autoincrement=False)
 
 class Stat(TableBase):
     __tablename__ = 'stats'
@@ -167,8 +167,8 @@ class Stat(TableBase):
 
 class TypeEfficacy(TableBase):
     __tablename__ = 'type_efficacy'
-    damage_type_id = Column(Integer, ForeignKey('types.id'), primary_key=True, nullable=False)
-    target_type_id = Column(Integer, ForeignKey('types.id'), primary_key=True, nullable=False)
+    damage_type_id = Column(Integer, ForeignKey('types.id'), primary_key=True, nullable=False, autoincrement=False)
+    target_type_id = Column(Integer, ForeignKey('types.id'), primary_key=True, nullable=False, autoincrement=False)
     damage_factor = Column(Integer, nullable=False)
 
 class Type(TableBase):