Fixed a slew of foriegn key import problems. #29
authorEevee <git@veekun.com>
Sat, 4 Jul 2009 03:12:13 +0000 (23:12 -0400)
committerEevee <git@veekun.com>
Sat, 4 Jul 2009 03:12:13 +0000 (23:12 -0400)
Curse's type_id was 0, which is bogus; this has been fixed by creating a
real ????? type.
Fourth-gen moves all had zero as a contest effect id, which was also
bogus.
Pokémon 494 and 495 were junk and have been scrapped entirely.
pokemon_form_groups's description column was too short.

pokedex's connect() now takes kwargs passed to sessionmaker().

A more major change: some tables, like pokemon, are self-referential and
contain rows that refer to rows later in the table (for example, Pikachu
evolves from Pichu, which has a higher id).  At the moment such a row is
loaded, the foreign key is thus bogus.  I solved this by turning on
autocommit and wrapping add() in a try block, then attempting to readd
every failed row again after the rest of the table is finished.  Slows
the import down a bit, but makes it work perfectly with foreign key
checks on.

pokedex/__init__.py
pokedex/data/csv/moves.csv
pokedex/data/csv/pokemon.csv
pokedex/data/csv/pokemon_egg_groups.csv
pokedex/data/csv/pokemon_stats.csv
pokedex/data/csv/pokemon_types.csv
pokedex/data/csv/types.csv
pokedex/db/__init__.py
pokedex/db/tables.py

index 6ac7344..02b8ce5 100644 (file)
@@ -1,6 +1,7 @@
 # encoding: utf8
 import sys
 
+from sqlalchemy.exc import IntegrityError
 import sqlalchemy.types
 
 from .db import connect, metadata, tables as tables_module
@@ -25,7 +26,8 @@ def csvimport(engine_uri, directory='.'):
 
     from sqlalchemy.orm.attributes import instrumentation_registry
 
-    session = connect(engine_uri)
+    # Use autocommit in case rows fail due to foreign key incest
+    session = connect(engine_uri, autocommit=True, autoflush=False)
 
     metadata.create_all()
 
@@ -59,6 +61,7 @@ def csvimport(engine_uri, directory='.'):
 
         # Print the table name but leave the cursor in a fixed column
         print table_name + '...', ' ' * (40 - len(table_name)),
+        sys.stdout.flush()
 
         try:
             csvfile = open("%s/%s.csv" % (directory, table_name), 'rb')
@@ -70,6 +73,12 @@ def csvimport(engine_uri, directory='.'):
         reader = csv.reader(csvfile, lineterminator='\n')
         column_names = [unicode(column) for column in reader.next()]
 
+        # Self-referential tables may contain rows with foreign keys of
+        # other rows in the same table that do not yet exist.  We'll keep
+        # a running list of these and try inserting them again after the
+        # rest are done
+        failed_rows = []
+
         for csvs in reader:
             row = table_class()
 
@@ -91,11 +100,33 @@ def csvimport(engine_uri, directory='.'):
 
                 setattr(row, column_name, value)
 
-            session.add(row)
-
-        session.commit()
-        print 'loaded'
-
+            try:
+                session.add(row)
+                session.flush()
+            except IntegrityError as e:
+                failed_rows.append(row)
+
+        # Loop over the failed rows and keep trying to insert them.  If a loop
+        # doesn't manage to insert any rows, bail.
+        do_another_loop = True
+        while failed_rows and do_another_loop:
+            do_another_loop = False
+
+            for i, row in enumerate(failed_rows):
+                try:
+                    session.add(row)
+                    session.flush()
+
+                    # Success!
+                    del failed_rows[i]
+                    do_another_loop = True
+                except IntegrityError as e:
+                    pass
+
+        if failed_rows:
+            print len(failed_rows), "rows failed"
+        else:
+            print 'loaded'
 
 def csvexport(engine_uri, directory='.'):
     import csv
index 6de7843..f890919 100644 (file)
@@ -172,7 +172,7 @@ id,name,type_id,power,pp,accuracy,target_id,category,effect_id,effect_chance,con
 171,Nightmare,8,0,15,100,10,none,108,,smart,5,19
 172,Flame Wheel,10,60,25,100,10,physical,126,10,beauty,1,7
 173,Snore,1,40,15,100,10,special,93,30,cute,1,5
-174,Curse,0,0,10,100,10,none,110,,tough,31,21
+174,Curse,18,0,10,100,10,none,110,,tough,31,21
 175,Flail,1,1,15,100,10,physical,100,,cute,26,15
 176,Conversion2,1,0,30,100,7,none,94,,beauty,12,23
 177,Aeroblast,3,100,5,95,10,special,44,,cool,2,22
@@ -353,116 +353,116 @@ id,name,type_id,power,pp,accuracy,target_id,category,effect_id,effect_chance,con
 352,Water Pulse,11,60,20,100,10,special,77,20,beauty,21,17
 353,Doom Desire,9,120,5,85,10,special,149,,cool,24,17
 354,Psycho Boost,14,140,5,90,10,special,205,100,smart,3,22
-355,Roost,3,0,10,0,7,none,215,,cool,0,8
-356,Gravity,14,0,5,0,12,none,216,,beauty,0,13
-357,Miracle Eye,14,0,40,0,10,none,217,,cute,0,20
-358,Wake-Up Slap,2,60,10,100,10,physical,218,,smart,0,16
-359,Hammer Arm,2,100,10,90,10,physical,219,,cool,0,2
-360,Gyro Ball,9,1,5,100,10,physical,220,,beauty,0,15
-361,Healing Wish,14,0,10,0,7,none,221,,cute,0,8
-362,Brine,11,65,10,100,10,special,222,,smart,0,4
-363,Natural Gift,1,1,15,100,10,physical,223,,cool,0,18
-364,Feint,1,50,10,100,10,physical,224,,beauty,0,16
-365,Pluck,3,60,20,100,10,physical,225,,cute,0,12
-366,Tailwind,3,0,30,0,4,none,226,,smart,0,1
-367,Acupressure,1,0,30,0,5,none,227,,cool,0,11
-368,Metal Burst,9,1,10,100,1,physical,228,,beauty,0,15
-369,U-Turn,7,70,20,100,10,physical,229,,cute,0,16
-370,Close Combat,2,120,5,100,10,physical,230,,smart,0,22
-371,Payback,17,50,10,100,10,physical,231,,cool,0,6
-372,Assurance,17,50,10,100,10,physical,232,,beauty,0,15
-373,Embargo,17,0,15,100,10,none,233,,cute,0,13
-374,Fling,17,1,10,100,10,physical,234,,tough,0,23
-375,Psycho Shift,14,0,10,90,10,none,235,,cool,0,16
-376,Trump Card,1,1,5,0,10,special,236,,cool,0,21
-377,Heal Block,14,0,15,100,11,none,237,,cute,0,13
-378,Wring Out,1,1,5,100,10,special,238,,smart,0,22
-379,Power Trick,14,0,10,0,7,none,239,,cool,0,16
-380,Gastro Acid,4,0,10,100,10,none,240,,beauty,0,13
-381,Lucky Chant,1,0,30,0,4,none,241,,cute,0,13
-382,Me First,1,0,20,0,2,none,242,,cute,0,1
-383,Copycat,1,0,20,0,1,none,243,,cool,0,12
-384,Power Swap,14,0,10,0,10,none,244,,beauty,0,16
-385,Guard Swap,14,0,10,0,10,none,245,,cute,0,16
-386,Punishment,17,60,5,100,10,physical,246,,smart,0,23
-387,Last Resort,1,130,5,100,10,physical,247,,cute,0,21
-388,Worry Seed,12,0,10,100,10,none,248,,beauty,0,19
-389,Sucker Punch,17,80,5,100,10,physical,249,,smart,0,1
-390,Toxic Spikes,4,0,20,0,6,none,250,,smart,0,13
-391,Heart Swap,14,0,10,0,10,none,251,,cool,0,16
-392,Aqua Ring,11,0,20,0,7,none,252,,beauty,0,8
-393,Magnet Rise,13,0,10,0,7,none,253,,cute,0,13
-394,Flare Blitz,10,120,15,100,10,physical,254,10,smart,0,22
-395,Force Palm,2,60,10,100,10,physical,7,30,cool,0,18
-396,Aura Sphere,2,90,20,0,10,special,18,,beauty,0,17
-397,Rock Polish,6,0,20,0,7,none,53,,tough,0,1
-398,Poison Jab,4,80,20,100,10,physical,3,30,smart,0,4
-399,Dark Pulse,17,80,15,100,10,special,32,20,cool,0,17
-400,Night Slash,17,70,15,100,10,physical,44,,beauty,0,5
-401,Aqua Tail,11,90,10,90,10,physical,1,,cute,0,5
-402,Seed Bomb,12,80,15,100,10,physical,1,,smart,0,5
-403,Air Slash,3,75,20,95,10,special,32,30,cool,0,17
-404,X-Scissor,7,80,15,100,10,physical,1,,beauty,0,17
-405,Bug Buzz,7,90,10,100,10,special,73,10,cute,0,4
-406,Dragon Pulse,16,90,10,100,10,special,1,,smart,0,4
-407,Dragon Rush,16,100,10,75,10,physical,32,20,cool,0,18
-408,Power Gem,6,70,20,100,10,special,1,,beauty,0,5
-409,Drain Punch,2,60,5,100,10,physical,4,,beauty,0,20
-410,Vacuum Wave,2,40,30,100,10,special,104,,smart,0,1
-411,Focus Blast,2,120,5,70,10,special,73,10,cool,0,17
-412,Energy Ball,12,80,10,100,10,special,73,10,beauty,0,17
-413,Brave Bird,3,120,15,100,10,physical,199,,cute,0,18
-414,Earth Power,5,90,10,100,10,special,73,10,smart,0,18
-415,Switcheroo,17,0,10,100,10,none,178,,cool,0,12
-416,Giga Impact,1,150,5,90,10,physical,81,,beauty,0,22
-417,Nasty Plot,17,0,20,0,7,none,54,,cute,0,11
-418,Bullet Punch,9,40,30,100,10,physical,104,,smart,0,1
-419,Avalanche,15,60,10,100,10,physical,186,,cool,0,15
-420,Ice Shard,15,40,30,100,10,physical,104,,beauty,0,1
-421,Shadow Claw,8,70,15,100,10,physical,44,,cute,0,17
-422,Thunder Fang,13,65,15,95,10,physical,276,10,smart,0,5
-423,Ice Fang,15,65,15,95,10,physical,275,10,cool,0,5
-424,Fire Fang,10,65,15,95,10,physical,274,10,beauty,0,5
-425,Shadow Sneak,8,40,30,100,10,physical,104,,smart,0,1
-426,Mud Bomb,5,65,10,85,10,special,74,30,smart,0,18
-427,Psycho Cut,14,70,20,100,10,physical,44,,cool,0,17
-428,Zen Headbutt,14,80,15,90,10,physical,32,20,beauty,0,18
-429,Mirror Shot,9,65,10,85,10,special,74,30,cute,0,17
-430,Flash Cannon,9,80,10,100,10,special,73,10,smart,0,17
-431,Rock Climb,1,90,20,85,10,physical,77,20,cool,0,18
-432,Defog,3,0,15,0,10,none,259,,beauty,0,13
-433,Trick Room,14,0,5,0,12,none,260,,cute,0,14
-434,Draco Meteor,16,140,5,90,10,special,205,100,smart,0,22
-435,Discharge,13,80,15,100,9,special,7,30,cool,0,17
-436,Lava Plume,10,80,15,100,9,special,5,30,tough,0,17
-437,Leaf Storm,12,140,5,90,10,special,205,100,cute,0,22
-438,Power Whip,12,120,10,85,10,physical,1,,beauty,0,5
-439,Rock Wrecker,6,150,5,90,10,physical,81,,tough,0,22
-440,Cross Poison,4,70,20,100,10,physical,210,10,cool,0,5
-441,Gunk Shot,4,120,5,70,10,physical,3,30,cool,0,5
-442,Iron Head,9,80,15,100,10,physical,32,30,tough,0,18
-443,Magnet Bomb,9,60,20,0,10,physical,18,,cool,0,5
-444,Stone Edge,6,100,5,80,10,physical,44,,tough,0,4
-445,Captivate,1,0,20,100,11,none,266,,beauty,0,19
-446,Stealth Rock,6,0,20,0,6,none,267,,cool,0,13
-447,Grass Knot,12,1,20,100,10,special,197,,smart,0,4
-448,Chatter,3,60,20,100,10,special,268,,smart,0,23
-449,Judgment,1,100,10,100,10,special,269,,smart,0,14
-450,Bug Bite,7,60,20,100,10,physical,225,,tough,0,12
-451,Charge Beam,13,50,10,90,10,special,277,70,beauty,0,17
-452,Wood Hammer,12,120,15,100,10,physical,199,,tough,0,18
-453,Aqua Jet,11,40,20,100,10,physical,104,,beauty,0,1
-454,Attack Order,7,90,15,100,10,physical,44,,smart,0,4
-455,Defend Order,7,0,10,0,7,none,207,,smart,0,11
-456,Heal Order,7,0,10,0,7,none,33,,smart,0,8
-457,Head Smash,6,150,5,80,10,physical,270,,tough,0,22
-458,Double Hit,1,35,10,90,10,physical,45,,smart,0,7
-459,Roar Of Time,16,150,5,90,10,special,81,,cool,0,22
-460,Spacial Rend,16,100,5,95,10,special,44,,tough,0,4
-461,Lunar Dance,14,0,10,0,7,none,271,,beauty,0,8
-462,Crush Grip,1,1,5,100,10,physical,238,,tough,0,15
-463,Magma Storm,10,120,5,70,10,special,43,,tough,0,7
-464,Dark Void,17,0,10,80,11,none,2,,smart,0,19
-465,Seed Flare,12,120,5,85,10,special,272,40,cool,0,22
-466,Ominous Wind,8,60,5,100,10,special,141,10,smart,0,11
-467,Shadow Force,8,120,5,100,10,physical,273,,smart,0,22
+355,Roost,3,0,10,0,7,none,215,,cool,,8
+356,Gravity,14,0,5,0,12,none,216,,beauty,,13
+357,Miracle Eye,14,0,40,0,10,none,217,,cute,,20
+358,Wake-Up Slap,2,60,10,100,10,physical,218,,smart,,16
+359,Hammer Arm,2,100,10,90,10,physical,219,,cool,,2
+360,Gyro Ball,9,1,5,100,10,physical,220,,beauty,,15
+361,Healing Wish,14,0,10,0,7,none,221,,cute,,8
+362,Brine,11,65,10,100,10,special,222,,smart,,4
+363,Natural Gift,1,1,15,100,10,physical,223,,cool,,18
+364,Feint,1,50,10,100,10,physical,224,,beauty,,16
+365,Pluck,3,60,20,100,10,physical,225,,cute,,12
+366,Tailwind,3,0,30,0,4,none,226,,smart,,1
+367,Acupressure,1,0,30,0,5,none,227,,cool,,11
+368,Metal Burst,9,1,10,100,1,physical,228,,beauty,,15
+369,U-Turn,7,70,20,100,10,physical,229,,cute,,16
+370,Close Combat,2,120,5,100,10,physical,230,,smart,,22
+371,Payback,17,50,10,100,10,physical,231,,cool,,6
+372,Assurance,17,50,10,100,10,physical,232,,beauty,,15
+373,Embargo,17,0,15,100,10,none,233,,cute,,13
+374,Fling,17,1,10,100,10,physical,234,,tough,,23
+375,Psycho Shift,14,0,10,90,10,none,235,,cool,,16
+376,Trump Card,1,1,5,0,10,special,236,,cool,,21
+377,Heal Block,14,0,15,100,11,none,237,,cute,,13
+378,Wring Out,1,1,5,100,10,special,238,,smart,,22
+379,Power Trick,14,0,10,0,7,none,239,,cool,,16
+380,Gastro Acid,4,0,10,100,10,none,240,,beauty,,13
+381,Lucky Chant,1,0,30,0,4,none,241,,cute,,13
+382,Me First,1,0,20,0,2,none,242,,cute,,1
+383,Copycat,1,0,20,0,1,none,243,,cool,,12
+384,Power Swap,14,0,10,0,10,none,244,,beauty,,16
+385,Guard Swap,14,0,10,0,10,none,245,,cute,,16
+386,Punishment,17,60,5,100,10,physical,246,,smart,,23
+387,Last Resort,1,130,5,100,10,physical,247,,cute,,21
+388,Worry Seed,12,0,10,100,10,none,248,,beauty,,19
+389,Sucker Punch,17,80,5,100,10,physical,249,,smart,,1
+390,Toxic Spikes,4,0,20,0,6,none,250,,smart,,13
+391,Heart Swap,14,0,10,0,10,none,251,,cool,,16
+392,Aqua Ring,11,0,20,0,7,none,252,,beauty,,8
+393,Magnet Rise,13,0,10,0,7,none,253,,cute,,13
+394,Flare Blitz,10,120,15,100,10,physical,254,10,smart,,22
+395,Force Palm,2,60,10,100,10,physical,7,30,cool,,18
+396,Aura Sphere,2,90,20,0,10,special,18,,beauty,,17
+397,Rock Polish,6,0,20,0,7,none,53,,tough,,1
+398,Poison Jab,4,80,20,100,10,physical,3,30,smart,,4
+399,Dark Pulse,17,80,15,100,10,special,32,20,cool,,17
+400,Night Slash,17,70,15,100,10,physical,44,,beauty,,5
+401,Aqua Tail,11,90,10,90,10,physical,1,,cute,,5
+402,Seed Bomb,12,80,15,100,10,physical,1,,smart,,5
+403,Air Slash,3,75,20,95,10,special,32,30,cool,,17
+404,X-Scissor,7,80,15,100,10,physical,1,,beauty,,17
+405,Bug Buzz,7,90,10,100,10,special,73,10,cute,,4
+406,Dragon Pulse,16,90,10,100,10,special,1,,smart,,4
+407,Dragon Rush,16,100,10,75,10,physical,32,20,cool,,18
+408,Power Gem,6,70,20,100,10,special,1,,beauty,,5
+409,Drain Punch,2,60,5,100,10,physical,4,,beauty,,20
+410,Vacuum Wave,2,40,30,100,10,special,104,,smart,,1
+411,Focus Blast,2,120,5,70,10,special,73,10,cool,,17
+412,Energy Ball,12,80,10,100,10,special,73,10,beauty,,17
+413,Brave Bird,3,120,15,100,10,physical,199,,cute,,18
+414,Earth Power,5,90,10,100,10,special,73,10,smart,,18
+415,Switcheroo,17,0,10,100,10,none,178,,cool,,12
+416,Giga Impact,1,150,5,90,10,physical,81,,beauty,,22
+417,Nasty Plot,17,0,20,0,7,none,54,,cute,,11
+418,Bullet Punch,9,40,30,100,10,physical,104,,smart,,1
+419,Avalanche,15,60,10,100,10,physical,186,,cool,,15
+420,Ice Shard,15,40,30,100,10,physical,104,,beauty,,1
+421,Shadow Claw,8,70,15,100,10,physical,44,,cute,,17
+422,Thunder Fang,13,65,15,95,10,physical,276,10,smart,,5
+423,Ice Fang,15,65,15,95,10,physical,275,10,cool,,5
+424,Fire Fang,10,65,15,95,10,physical,274,10,beauty,,5
+425,Shadow Sneak,8,40,30,100,10,physical,104,,smart,,1
+426,Mud Bomb,5,65,10,85,10,special,74,30,smart,,18
+427,Psycho Cut,14,70,20,100,10,physical,44,,cool,,17
+428,Zen Headbutt,14,80,15,90,10,physical,32,20,beauty,,18
+429,Mirror Shot,9,65,10,85,10,special,74,30,cute,,17
+430,Flash Cannon,9,80,10,100,10,special,73,10,smart,,17
+431,Rock Climb,1,90,20,85,10,physical,77,20,cool,,18
+432,Defog,3,0,15,0,10,none,259,,beauty,,13
+433,Trick Room,14,0,5,0,12,none,260,,cute,,14
+434,Draco Meteor,16,140,5,90,10,special,205,100,smart,,22
+435,Discharge,13,80,15,100,9,special,7,30,cool,,17
+436,Lava Plume,10,80,15,100,9,special,5,30,tough,,17
+437,Leaf Storm,12,140,5,90,10,special,205,100,cute,,22
+438,Power Whip,12,120,10,85,10,physical,1,,beauty,,5
+439,Rock Wrecker,6,150,5,90,10,physical,81,,tough,,22
+440,Cross Poison,4,70,20,100,10,physical,210,10,cool,,5
+441,Gunk Shot,4,120,5,70,10,physical,3,30,cool,,5
+442,Iron Head,9,80,15,100,10,physical,32,30,tough,,18
+443,Magnet Bomb,9,60,20,0,10,physical,18,,cool,,5
+444,Stone Edge,6,100,5,80,10,physical,44,,tough,,4
+445,Captivate,1,0,20,100,11,none,266,,beauty,,19
+446,Stealth Rock,6,0,20,0,6,none,267,,cool,,13
+447,Grass Knot,12,1,20,100,10,special,197,,smart,,4
+448,Chatter,3,60,20,100,10,special,268,,smart,,23
+449,Judgment,1,100,10,100,10,special,269,,smart,,14
+450,Bug Bite,7,60,20,100,10,physical,225,,tough,,12
+451,Charge Beam,13,50,10,90,10,special,277,70,beauty,,17
+452,Wood Hammer,12,120,15,100,10,physical,199,,tough,,18
+453,Aqua Jet,11,40,20,100,10,physical,104,,beauty,,1
+454,Attack Order,7,90,15,100,10,physical,44,,smart,,4
+455,Defend Order,7,0,10,0,7,none,207,,smart,,11
+456,Heal Order,7,0,10,0,7,none,33,,smart,,8
+457,Head Smash,6,150,5,80,10,physical,270,,tough,,22
+458,Double Hit,1,35,10,90,10,physical,45,,smart,,7
+459,Roar Of Time,16,150,5,90,10,special,81,,cool,,22
+460,Spacial Rend,16,100,5,95,10,special,44,,tough,,4
+461,Lunar Dance,14,0,10,0,7,none,271,,beauty,,8
+462,Crush Grip,1,1,5,100,10,physical,238,,tough,,15
+463,Magma Storm,10,120,5,70,10,special,43,,tough,,7
+464,Dark Void,17,0,10,80,11,none,2,,smart,,19
+465,Seed Flare,12,120,5,85,10,special,272,40,cool,,22
+466,Ominous Wind,8,60,5,100,10,special,141,10,smart,,11
+467,Shadow Force,8,120,5,100,10,physical,273,,smart,,22
index 8289e5d..6b06b6d 100644 (file)
@@ -492,8 +492,6 @@ id,name,forme_name,forme_base_pokemon_id,generation_id,evolution_chain_id,evolut
 491,Darkrai,,,4,252,,,,15,505,Pitch-Black,black,12,,-1,3,210,0,,0,0,0
 492,Shaymin,land,,4,253,,,,2,21,Gratitude,green,8,,-1,45,64,100,,0,0,0
 493,Arceus,,,4,254,,,,32,3200,Alpha,gray,8,,-1,3,255,0,,0,0,0
-494,Pokemon494,,,4,,,,,0,0,,,0,,-1,3,255,0,,0,0,0
-495,Pokemon495,,,4,,,,,0,0,,,0,,-1,3,255,0,,0,0,0
 496,Deoxys,attack,386,4,202,,,,17,608,DNA,red,12,rare,-1,3,215,0,,0,0,0
 497,Deoxys,defense,386,4,202,,,,17,608,DNA,red,12,rare,-1,3,215,0,,0,0,0
 498,Deoxys,speed,386,4,202,,,,17,608,DNA,red,12,rare,-1,3,215,0,,0,0,0
index 5b96b3d..9d52faf 100644 (file)
@@ -645,8 +645,6 @@ pokemon_id,egg_group_id
 491,15
 492,15
 493,15
-494,15
-495,15
 496,15
 497,15
 498,15
index 5a43134..f21bb20 100644 (file)
@@ -2957,18 +2957,6 @@ pokemon_id,stat_id,base_stat,effort
 493,4,120,0
 493,5,120,0
 493,6,120,0
-494,1,10,0
-494,2,10,0
-494,3,10,0
-494,4,10,0
-494,5,10,0
-494,6,10,0
-495,1,10,0
-495,2,10,0
-495,3,10,0
-495,4,10,0
-495,5,10,0
-495,6,10,0
 496,1,50,0
 496,2,180,2
 496,3,20,0
index cf3cefe..e701d8f 100644 (file)
@@ -79,8 +79,6 @@ pokemon_id,type_id,slot
 474,1,1
 486,1,1
 493,1,1
-494,1,1
-495,1,1
 56,2,1
 57,2,1
 62,2,2
index e8db46e..2450380 100644 (file)
@@ -16,3 +16,4 @@ id,name,abbreviation
 15,ice,ICE
 16,dragon,DRG
 17,dark,DAR
+18,?????,???
index c9b739d..ced519b 100644 (file)
@@ -2,7 +2,7 @@ from sqlalchemy import MetaData, Table, create_engine, orm
 
 from .tables import metadata
 
-def connect(uri):
+def connect(uri, **kwargs):
     """Connects to the requested URI.  Returns a session object.
 
     Calling this function also binds the metadata object to the created engine.
@@ -26,7 +26,9 @@ def connect(uri):
     conn = engine.connect()
     metadata.bind = engine
 
-    sm = orm.sessionmaker(autoflush=True, autocommit=False, bind=engine)
+    session_args = dict(autoflush=True, autocommit=False, bind=engine)
+    session_args.update(kwargs)
+    sm = orm.sessionmaker(**session_args)
     session = orm.scoped_session(sm)
 
     return session
index bae2211..3638e53 100644 (file)
@@ -176,7 +176,7 @@ class Move(TableBase):
     effect_id = Column(Integer, ForeignKey('move_effects.id'), nullable=False)
     effect_chance = Column(Integer)
     contest_type = Column(Unicode(8), nullable=False)
-    contest_effect_id = Column(Integer, ForeignKey('contest_effects.id'), nullable=False)
+    contest_effect_id = Column(Integer, ForeignKey('contest_effects.id'), nullable=True)
     super_contest_effect_id = Column(Integer, nullable=False)
 
 class Pokemon(TableBase):
@@ -270,7 +270,7 @@ class PokemonFlavorText(TableBase):
 class PokemonFormGroup(TableBase):
     __tablename__ = 'pokemon_form_groups'
     pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
-    description = Column(Unicode(255), nullable=False)
+    description = Column(Unicode(512), nullable=False)
 
 class PokemonFormSprite(TableBase):
     __tablename__ = 'pokemon_form_sprites'