3 from sqlalchemy
import Column
, ForeignKey
, MetaData
, PrimaryKeyConstraint
, Table
4 from sqlalchemy
.ext
.declarative
import declarative_base
5 from sqlalchemy
.ext
.associationproxy
import association_proxy
6 from sqlalchemy
.orm
import backref
, eagerload_all
, relation
7 from sqlalchemy
.orm
.session
import Session
8 from sqlalchemy
.sql
import and_
9 from sqlalchemy
.types
import *
11 from pokedex
.db
import markdown
14 TableBase
= declarative_base(metadata
=metadata
)
16 class Ability(TableBase
):
17 __tablename__
= 'abilities'
18 __singlename__
= 'ability'
19 id = Column(Integer
, primary_key
=True, nullable
=False)
20 name
= Column(Unicode(24), nullable
=False)
21 generation_id
= Column(Integer
, ForeignKey('generations.id'), nullable
=False)
22 effect
= Column(markdown
.MarkdownColumn(5120), nullable
=False)
23 short_effect
= Column(markdown
.MarkdownColumn(255), nullable
=False)
25 class AbilityFlavorText(TableBase
):
26 __tablename__
= 'ability_flavor_text'
27 ability_id
= Column(Integer
, ForeignKey('abilities.id'), primary_key
=True, nullable
=False, autoincrement
=False)
28 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False)
29 flavor_text
= Column(Unicode(64), nullable
=False)
31 class AbilityName(TableBase
):
32 __tablename__
= 'ability_names'
33 ability_id
= Column(Integer
, ForeignKey('abilities.id'), primary_key
=True, nullable
=False, autoincrement
=False)
34 language_id
= Column(Integer
, ForeignKey('languages.id'), primary_key
=True, nullable
=False, autoincrement
=False)
35 name
= Column(Unicode(16), nullable
=False)
37 class Berry(TableBase
):
38 __tablename__
= 'berries'
39 id = Column(Integer
, primary_key
=True, nullable
=False)
40 item_id
= Column(Integer
, ForeignKey('items.id'), nullable
=False)
41 firmness_id
= Column(Integer
, ForeignKey('berry_firmness.id'), nullable
=False)
42 natural_gift_power
= Column(Integer
, nullable
=True)
43 natural_gift_type_id
= Column(Integer
, ForeignKey('types.id'), nullable
=True)
44 size
= Column(Integer
, nullable
=False)
45 max_harvest
= Column(Integer
, nullable
=False)
46 growth_time
= Column(Integer
, nullable
=False)
47 soil_dryness
= Column(Integer
, nullable
=False)
48 smoothness
= Column(Integer
, nullable
=False)
50 class BerryFirmness(TableBase
):
51 __tablename__
= 'berry_firmness'
52 id = Column(Integer
, primary_key
=True, nullable
=False)
53 name
= Column(Unicode(10), nullable
=False)
55 class BerryFlavor(TableBase
):
56 __tablename__
= 'berry_flavors'
57 berry_id
= Column(Integer
, ForeignKey('berries.id'), primary_key
=True, nullable
=False, autoincrement
=False)
58 contest_type_id
= Column(Integer
, ForeignKey('contest_types.id'), primary_key
=True, nullable
=False, autoincrement
=False)
59 flavor
= Column(Integer
, nullable
=False)
61 class ContestCombo(TableBase
):
62 __tablename__
= 'contest_combos'
63 first_move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
64 second_move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
66 class ContestEffect(TableBase
):
67 __tablename__
= 'contest_effects'
68 id = Column(Integer
, primary_key
=True, nullable
=False)
69 appeal
= Column(SmallInteger
, nullable
=False)
70 jam
= Column(SmallInteger
, nullable
=False)
71 flavor_text
= Column(Unicode(64), nullable
=False)
72 effect
= Column(Unicode(255), nullable
=False)
74 class ContestType(TableBase
):
75 __tablename__
= 'contest_types'
76 id = Column(Integer
, primary_key
=True, nullable
=False)
77 name
= Column(Unicode(6), nullable
=False)
78 flavor
= Column(Unicode(6), nullable
=False)
79 color
= Column(Unicode(6), nullable
=False)
81 class EggGroup(TableBase
):
82 __tablename__
= 'egg_groups'
83 id = Column(Integer
, primary_key
=True, nullable
=False)
84 name
= Column(Unicode(16), nullable
=False)
86 class Encounter(TableBase
):
87 """Rows in this table represent encounters with wild Pokémon. Bear with
90 Within a given area in a given game, encounters are differentiated by the
91 "slot" they are in and the state of the game world.
93 What the player is doing to get an encounter, such as surfing or walking
94 through tall grass, is called terrain. Each terrain has its own set of
97 Within a terrain, slots are defined primarily by rarity. Each slot can
98 also be affected by world conditions; for example, the 20% slot for walking
99 in tall grass is affected by whether a swarm is in effect in that area.
100 "Is there a swarm?" is a condition; "there is a swarm" and "there is not a
101 swarm" are the possible values of this condition.
103 A slot (20% walking in grass) and any appropriate world conditions (no
104 swarm) are thus enough to define a specific encounter.
106 Well, okay, almost: each slot actually appears twice.
109 __tablename__
= 'encounters'
110 id = Column(Integer
, primary_key
=True, nullable
=False)
111 version_id
= Column(Integer
, ForeignKey('versions.id'), nullable
=False, autoincrement
=False)
112 location_area_id
= Column(Integer
, ForeignKey('location_areas.id'), nullable
=False, autoincrement
=False)
113 encounter_slot_id
= Column(Integer
, ForeignKey('encounter_slots.id'), nullable
=False, autoincrement
=False)
114 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), nullable
=False, autoincrement
=False)
115 min_level
= Column(Integer
, nullable
=False, autoincrement
=False)
116 max_level
= Column(Integer
, nullable
=False, autoincrement
=False)
118 class EncounterCondition(TableBase
):
119 """Rows in this table represent varying conditions in the game world, such
123 __tablename__
= 'encounter_conditions'
124 id = Column(Integer
, primary_key
=True, nullable
=False)
125 name
= Column(Unicode(64), nullable
=False)
127 class EncounterConditionValue(TableBase
):
128 """Rows in this table represent possible states for a condition; for
129 example, the state of 'swarm' could be 'swarm' or 'no swarm'.
132 __tablename__
= 'encounter_condition_values'
133 id = Column(Integer
, primary_key
=True, nullable
=False)
134 encounter_condition_id
= Column(Integer
, ForeignKey('encounter_conditions.id'), primary_key
=False, nullable
=False, autoincrement
=False)
135 name
= Column(Unicode(64), nullable
=False)
136 is_default
= Column(Boolean
, nullable
=False)
138 class EncounterConditionValueMap(TableBase
):
139 """Maps encounters to the specific conditions under which they occur."""
141 __tablename__
= 'encounter_condition_value_map'
142 encounter_id
= Column(Integer
, ForeignKey('encounters.id'), primary_key
=True, nullable
=False, autoincrement
=False)
143 encounter_condition_value_id
= Column(Integer
, ForeignKey('encounter_condition_values.id'), primary_key
=True, nullable
=False, autoincrement
=False)
145 class EncounterTerrain(TableBase
):
146 """Rows in this table represent ways the player can enter a wild encounter,
147 e.g., surfing, fishing, or walking through tall grass.
150 __tablename__
= 'encounter_terrain'
151 id = Column(Integer
, primary_key
=True, nullable
=False)
152 name
= Column(Unicode(64), nullable
=False)
154 class EncounterSlot(TableBase
):
155 """Rows in this table represent an abstract "slot" within a terrain,
156 associated with both some set of conditions and a rarity.
158 Note that there are two encounters per slot, so the rarities will only add
162 __tablename__
= 'encounter_slots'
163 id = Column(Integer
, primary_key
=True, nullable
=False)
164 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), nullable
=False, autoincrement
=False)
165 encounter_terrain_id
= Column(Integer
, ForeignKey('encounter_terrain.id'), primary_key
=False, nullable
=False, autoincrement
=False)
166 slot
= Column(Integer
, nullable
=True)
167 rarity
= Column(Integer
, nullable
=False)
169 class EncounterSlotCondition(TableBase
):
170 """Lists all conditions that affect each slot."""
172 __tablename__
= 'encounter_slot_conditions'
173 encounter_slot_id
= Column(Integer
, ForeignKey('encounter_slots.id'), primary_key
=True, nullable
=False, autoincrement
=False)
174 encounter_condition_id
= Column(Integer
, ForeignKey('encounter_conditions.id'), primary_key
=True, nullable
=False, autoincrement
=False)
176 class EvolutionChain(TableBase
):
177 __tablename__
= 'evolution_chains'
178 id = Column(Integer
, primary_key
=True, nullable
=False)
179 growth_rate_id
= Column(Integer
, ForeignKey('growth_rates.id'), nullable
=False)
180 baby_trigger_item_id
= Column(Integer
, ForeignKey('items.id'), nullable
=True)
182 class EvolutionTrigger(TableBase
):
183 __tablename__
= 'evolution_triggers'
184 id = Column(Integer
, primary_key
=True, nullable
=False)
185 identifier
= Column(Unicode(16), nullable
=False)
187 class Experience(TableBase
):
188 __tablename__
= 'experience'
189 growth_rate_id
= Column(Integer
, ForeignKey('growth_rates.id'), primary_key
=True, nullable
=False)
190 level
= Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False)
191 experience
= Column(Integer
, nullable
=False)
193 class Generation(TableBase
):
194 __tablename__
= 'generations'
195 id = Column(Integer
, primary_key
=True, nullable
=False)
196 main_region_id
= Column(Integer
, ForeignKey('regions.id'))
197 canonical_pokedex_id
= Column(Integer
, ForeignKey('pokedexes.id'))
198 name
= Column(Unicode(16), nullable
=False)
200 class GrowthRate(TableBase
):
201 """`formula` is written in LaTeX math notation."""
202 __tablename__
= 'growth_rates'
203 id = Column(Integer
, primary_key
=True, nullable
=False)
204 name
= Column(Unicode(20), nullable
=False)
205 formula
= Column(Unicode(500), nullable
=False)
207 class Item(TableBase
):
208 __tablename__
= 'items'
209 __singlename__
= 'item'
210 id = Column(Integer
, primary_key
=True, nullable
=False)
211 name
= Column(Unicode(20), nullable
=False)
212 category_id
= Column(Integer
, ForeignKey('item_categories.id'), nullable
=False)
213 cost
= Column(Integer
, nullable
=False)
214 fling_power
= Column(Integer
, nullable
=True)
215 fling_effect_id
= Column(Integer
, ForeignKey('item_fling_effects.id'), nullable
=True)
216 effect
= Column(markdown
.MarkdownColumn(5120), nullable
=False)
219 def appears_underground(self
):
220 return any(flag
.identifier
== u
'underground' for flag
in self
.flags
)
222 class ItemCategory(TableBase
):
223 __tablename__
= 'item_categories'
224 id = Column(Integer
, primary_key
=True, nullable
=False)
225 pocket_id
= Column(Integer
, ForeignKey('item_pockets.id'), nullable
=False)
226 name
= Column(Unicode(16), nullable
=False)
228 class ItemFlag(TableBase
):
229 __tablename__
= 'item_flags'
230 id = Column(Integer
, primary_key
=True, nullable
=False)
231 identifier
= Column(Unicode(24), nullable
=False)
232 name
= Column(Unicode(64), nullable
=False)
234 class ItemFlagMap(TableBase
):
235 __tablename__
= 'item_flag_map'
236 item_id
= Column(Integer
, ForeignKey('items.id'), primary_key
=True, autoincrement
=False, nullable
=False)
237 item_flag_id
= Column(Integer
, ForeignKey('item_flags.id'), primary_key
=True, autoincrement
=False, nullable
=False)
239 class ItemFlavorText(TableBase
):
240 __tablename__
= 'item_flavor_text'
241 item_id
= Column(Integer
, ForeignKey('items.id'), primary_key
=True, autoincrement
=False, nullable
=False)
242 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, autoincrement
=False, nullable
=False)
243 flavor_text
= Column(Unicode(255), nullable
=False)
245 class ItemFlingEffect(TableBase
):
246 __tablename__
= 'item_fling_effects'
247 id = Column(Integer
, primary_key
=True, nullable
=False)
248 effect
= Column(Unicode(255), nullable
=False)
250 class ItemInternalID(TableBase
):
251 __tablename__
= 'item_internal_ids'
252 item_id
= Column(Integer
, ForeignKey('items.id'), primary_key
=True, autoincrement
=False, nullable
=False)
253 generation_id
= Column(Integer
, ForeignKey('generations.id'), primary_key
=True, autoincrement
=False, nullable
=False)
254 internal_id
= Column(Integer
, nullable
=False)
256 class ItemName(TableBase
):
257 __tablename__
= 'item_names'
258 item_id
= Column(Integer
, ForeignKey('items.id'), primary_key
=True, nullable
=False, autoincrement
=False)
259 language_id
= Column(Integer
, ForeignKey('languages.id'), primary_key
=True, nullable
=False, autoincrement
=False)
260 name
= Column(Unicode(16), nullable
=False)
262 class ItemPocket(TableBase
):
263 __tablename__
= 'item_pockets'
264 id = Column(Integer
, primary_key
=True, nullable
=False)
265 identifier
= Column(Unicode(16), nullable
=False)
266 name
= Column(Unicode(16), nullable
=False)
268 class Language(TableBase
):
269 __tablename__
= 'languages'
270 id = Column(Integer
, primary_key
=True, nullable
=False)
271 iso639
= Column(Unicode(2), nullable
=False)
272 iso3166
= Column(Unicode(2), nullable
=False)
273 name
= Column(Unicode(16), nullable
=False)
275 class Location(TableBase
):
276 __tablename__
= 'locations'
277 __singlename__
= 'location'
278 id = Column(Integer
, primary_key
=True, nullable
=False)
279 region_id
= Column(Integer
, ForeignKey('regions.id'))
280 name
= Column(Unicode(64), nullable
=False)
282 class LocationArea(TableBase
):
283 __tablename__
= 'location_areas'
284 id = Column(Integer
, primary_key
=True, nullable
=False)
285 location_id
= Column(Integer
, ForeignKey('locations.id'), nullable
=False)
286 internal_id
= Column(Integer
, nullable
=False)
287 name
= Column(Unicode(64), nullable
=True)
289 class LocationAreaEncounterRate(TableBase
):
290 __tablename__
= 'location_area_encounter_rates'
291 location_area_id
= Column(Integer
, ForeignKey('location_areas.id'), primary_key
=True, nullable
=False, autoincrement
=False)
292 encounter_terrain_id
= Column(Integer
, ForeignKey('encounter_terrain.id'), primary_key
=True, nullable
=False, autoincrement
=False)
293 version_id
= Column(Integer
, ForeignKey('versions.id'), primary_key
=True, autoincrement
=False)
294 rate
= Column(Integer
, nullable
=True)
296 class LocationInternalID(TableBase
):
297 __tablename__
= 'location_internal_ids'
298 location_id
= Column(Integer
, ForeignKey('locations.id'), nullable
=False, primary_key
=True)
299 generation_id
= Column(Integer
, ForeignKey('generations.id'), nullable
=False, primary_key
=True)
300 internal_id
= Column(Integer
, nullable
=False)
302 class Machine(TableBase
):
303 __tablename__
= 'machines'
304 machine_number
= Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False)
305 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False)
306 item_id
= Column(Integer
, ForeignKey('items.id'), nullable
=False)
307 move_id
= Column(Integer
, ForeignKey('moves.id'), nullable
=False)
311 return self
.machine_number
>= 100
313 class MoveBattleStyle(TableBase
):
314 __tablename__
= 'move_battle_styles'
315 id = Column(Integer
, primary_key
=True, nullable
=False)
316 name
= Column(Unicode(8), nullable
=False)
318 class MoveEffectCategory(TableBase
):
319 __tablename__
= 'move_effect_categories'
320 id = Column(Integer
, primary_key
=True, nullable
=False)
321 name
= Column(Unicode(64), nullable
=False)
322 can_affect_user
= Column(Boolean
, nullable
=False)
324 class MoveEffectCategoryMap(TableBase
):
325 __tablename__
= 'move_effect_category_map'
326 move_effect_id
= Column(Integer
, ForeignKey('move_effects.id'), primary_key
=True, nullable
=False)
327 move_effect_category_id
= Column(Integer
, ForeignKey('move_effect_categories.id'), primary_key
=True, nullable
=False)
328 affects_user
= Column(Boolean
, primary_key
=True, nullable
=False)
330 class MoveDamageClass(TableBase
):
331 __tablename__
= 'move_damage_classes'
332 id = Column(Integer
, primary_key
=True, nullable
=False)
333 name
= Column(Unicode(8), nullable
=False)
334 description
= Column(Unicode(64), nullable
=False)
336 class MoveEffect(TableBase
):
337 __tablename__
= 'move_effects'
338 id = Column(Integer
, primary_key
=True, nullable
=False)
339 short_effect
= Column(Unicode(256), nullable
=False)
340 effect
= Column(Unicode(5120), nullable
=False)
342 class MoveFlag(TableBase
):
343 __tablename__
= 'move_flags'
344 move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
345 move_flag_type_id
= Column(Integer
, ForeignKey('move_flag_types.id'), primary_key
=True, nullable
=False, autoincrement
=False)
347 class MoveFlagType(TableBase
):
348 __tablename__
= 'move_flag_types'
349 id = Column(Integer
, primary_key
=True, nullable
=False)
350 identifier
= Column(Unicode(16), nullable
=False)
351 name
= Column(Unicode(32), nullable
=False)
352 description
= Column(markdown
.MarkdownColumn(128), nullable
=False)
354 class MoveFlavorText(TableBase
):
355 __tablename__
= 'move_flavor_text'
356 move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
357 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False)
358 flavor_text
= Column(Unicode(255), nullable
=False)
360 class MoveName(TableBase
):
361 __tablename__
= 'move_names'
362 move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
363 language_id
= Column(Integer
, ForeignKey('languages.id'), primary_key
=True, nullable
=False, autoincrement
=False)
364 name
= Column(Unicode(16), nullable
=False)
366 class MoveTarget(TableBase
):
367 __tablename__
= 'move_targets'
368 id = Column(Integer
, primary_key
=True, nullable
=False)
369 name
= Column(Unicode(32), nullable
=False)
370 description
= Column(Unicode(128), nullable
=False)
372 class Move(TableBase
):
373 __tablename__
= 'moves'
374 __singlename__
= 'move'
375 id = Column(Integer
, primary_key
=True, nullable
=False)
376 name
= Column(Unicode(24), nullable
=False)
377 generation_id
= Column(Integer
, ForeignKey('generations.id'), nullable
=False)
378 type_id
= Column(Integer
, ForeignKey('types.id'), nullable
=False)
379 power
= Column(SmallInteger
, nullable
=False)
380 pp
= Column(SmallInteger
, nullable
=False)
381 accuracy
= Column(SmallInteger
, nullable
=True)
382 priority
= Column(SmallInteger
, nullable
=False)
383 target_id
= Column(Integer
, ForeignKey('move_targets.id'), nullable
=False)
384 damage_class_id
= Column(Integer
, ForeignKey('move_damage_classes.id'), nullable
=False)
385 effect_id
= Column(Integer
, ForeignKey('move_effects.id'), nullable
=False)
386 effect_chance
= Column(Integer
)
387 contest_type_id
= Column(Integer
, ForeignKey('contest_types.id'), nullable
=True)
388 contest_effect_id
= Column(Integer
, ForeignKey('contest_effects.id'), nullable
=True)
389 super_contest_effect_id
= Column(Integer
, ForeignKey('super_contest_effects.id'), nullable
=True)
391 class Nature(TableBase
):
392 __tablename__
= 'natures'
393 __singlename__
= 'nature'
394 id = Column(Integer
, primary_key
=True, nullable
=False)
395 name
= Column(Unicode(8), nullable
=False)
396 decreased_stat_id
= Column(Integer
, ForeignKey('stats.id'), nullable
=False)
397 increased_stat_id
= Column(Integer
, ForeignKey('stats.id'), nullable
=False)
398 hates_flavor_id
= Column(Integer
, ForeignKey('contest_types.id'), nullable
=False)
399 likes_flavor_id
= Column(Integer
, ForeignKey('contest_types.id'), nullable
=False)
402 def is_neutral(self
):
403 u
"""Returns True iff this nature doesn't alter a Pokémon's stats,
404 bestow taste preferences, etc.
406 return self
.increased_stat_id
== self
.decreased_stat_id
408 class NatureBattleStylePreference(TableBase
):
409 __tablename__
= 'nature_battle_style_preferences'
410 nature_id
= Column(Integer
, ForeignKey('natures.id'), primary_key
=True, nullable
=False)
411 move_battle_style_id
= Column(Integer
, ForeignKey('move_battle_styles.id'), primary_key
=True, nullable
=False)
412 low_hp_preference
= Column(Integer
, nullable
=False)
413 high_hp_preference
= Column(Integer
, nullable
=False)
415 class NatureName(TableBase
):
416 __tablename__
= 'nature_names'
417 nature_id
= Column(Integer
, ForeignKey('natures.id'), primary_key
=True, nullable
=False, autoincrement
=False)
418 language_id
= Column(Integer
, ForeignKey('languages.id'), primary_key
=True, nullable
=False, autoincrement
=False)
419 name
= Column(Unicode(8), nullable
=False)
421 class NaturePokeathlonStat(TableBase
):
422 __tablename__
= 'nature_pokeathlon_stats'
423 nature_id
= Column(Integer
, ForeignKey('natures.id'), primary_key
=True, nullable
=False)
424 pokeathlon_stat_id
= Column(Integer
, ForeignKey('pokeathlon_stats.id'), primary_key
=True, nullable
=False)
425 max_change
= Column(Integer
, nullable
=False)
427 class PokeathlonStat(TableBase
):
428 __tablename__
= 'pokeathlon_stats'
429 id = Column(Integer
, primary_key
=True, nullable
=False)
430 name
= Column(Unicode(8), nullable
=False)
432 class Pokedex(TableBase
):
433 __tablename__
= 'pokedexes'
434 id = Column(Integer
, primary_key
=True, nullable
=False)
435 region_id
= Column(Integer
, ForeignKey('regions.id'), nullable
=True)
436 name
= Column(Unicode(16), nullable
=False)
437 description
= Column(Unicode(512))
439 class PokedexVersionGroup(TableBase
):
440 __tablename__
= 'pokedex_version_groups'
441 pokedex_id
= Column(Integer
, ForeignKey('pokedexes.id'), primary_key
=True, nullable
=False, autoincrement
=False)
442 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False)
444 class Pokemon(TableBase
):
445 """The core to this whole mess.
447 Note that I use both 'forme' and 'form' in both code and the database. I
448 only use 'forme' when specifically referring to Pokémon that have multiple
449 distinct species as forms—i.e., different stats or movesets. 'Form' is a
450 more general term referring to any variation within a species, including
451 purely cosmetic forms like Unown.
453 __tablename__
= 'pokemon'
454 __singlename__
= 'pokemon'
455 id = Column(Integer
, primary_key
=True, nullable
=False)
456 name
= Column(Unicode(20), nullable
=False)
457 forme_name
= Column(Unicode(16))
458 forme_base_pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'))
459 generation_id
= Column(Integer
, ForeignKey('generations.id'))
460 evolution_chain_id
= Column(Integer
, ForeignKey('evolution_chains.id'))
461 height
= Column(Integer
, nullable
=False)
462 weight
= Column(Integer
, nullable
=False)
463 species
= Column(Unicode(16), nullable
=False)
464 color_id
= Column(Integer
, ForeignKey('pokemon_colors.id'), nullable
=False)
465 pokemon_shape_id
= Column(Integer
, ForeignKey('pokemon_shapes.id'), nullable
=True)
466 habitat_id
= Column(Integer
, ForeignKey('pokemon_habitats.id'), nullable
=True)
467 gender_rate
= Column(Integer
, nullable
=False)
468 capture_rate
= Column(Integer
, nullable
=False)
469 base_experience
= Column(Integer
, nullable
=False)
470 base_happiness
= Column(Integer
, nullable
=False)
471 is_baby
= Column(Boolean
, nullable
=False)
472 hatch_counter
= Column(Integer
, nullable
=False)
473 has_gen4_fem_sprite
= Column(Boolean
, nullable
=False)
474 has_gen4_fem_back_sprite
= Column(Boolean
, nullable
=False)
476 ### Stuff to handle alternate Pokémon forms
479 def national_id(self
):
480 """Returns the National Pokédex number for this Pokémon. Use this
481 instead of the id directly; alternate formes may make the id incorrect.
484 if self
.forme_base_pokemon_id
:
485 return self
.forme_base_pokemon_id
490 """Returns the name of this Pokémon, including its Forme, if any."""
493 return "%s %s" %
(self
.forme_name
.title(), self
.name
)
497 def normal_form(self
):
498 """Returns the normal form for this Pokémon; i.e., this will return
499 regular Deoxys when called on any Deoxys form.
502 if self
.forme_base_pokemon
:
503 return self
.forme_base_pokemon
509 def stat(self
, stat_name
):
510 """Returns a PokemonStat record for the given stat name (or Stat row
511 object). Uses the normal has-many machinery, so all the stats are
514 if isinstance(stat_name
, Stat
):
515 stat_name
= stat_name
.name
517 for pokemon_stat
in self
.stats
:
518 if pokemon_stat
.stat
.name
== stat_name
:
521 raise KeyError(u
'No stat named %s' % stat_name
)
524 def better_damage_class(self
):
525 u
"""Returns the MoveDamageClass that this Pokémon is best suited for,
526 based on its attack stats.
528 If the attack stats are about equal (within 5), returns None. The
529 value None, not the damage class called 'None'.
531 phys
= self
.stat(u
'Attack')
532 spec
= self
.stat(u
'Special Attack')
534 diff
= phys
.base_stat
- spec
.base_stat
537 return phys
.stat
.damage_class
539 return spec
.stat
.damage_class
543 class PokemonAbility(TableBase
):
544 __tablename__
= 'pokemon_abilities'
545 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
546 ability_id
= Column(Integer
, ForeignKey('abilities.id'), nullable
=False)
547 slot
= Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False)
549 class PokemonColor(TableBase
):
550 __tablename__
= 'pokemon_colors'
551 id = Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False)
552 name
= Column(Unicode(6), nullable
=False)
554 class PokemonDexNumber(TableBase
):
555 __tablename__
= 'pokemon_dex_numbers'
556 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
557 pokedex_id
= Column(Integer
, ForeignKey('pokedexes.id'), primary_key
=True, nullable
=False, autoincrement
=False)
558 pokedex_number
= Column(Integer
, nullable
=False)
560 class PokemonEggGroup(TableBase
):
561 __tablename__
= 'pokemon_egg_groups'
562 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
563 egg_group_id
= Column(Integer
, ForeignKey('egg_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False)
565 class PokemonEvolution(TableBase
):
566 __tablename__
= 'pokemon_evolution'
567 from_pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), nullable
=False)
568 to_pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
569 evolution_trigger_id
= Column(Integer
, ForeignKey('evolution_triggers.id'), nullable
=False)
570 trigger_item_id
= Column(Integer
, ForeignKey('items.id'), nullable
=True)
571 minimum_level
= Column(Integer
, nullable
=True)
572 gender
= Column(Enum('male', 'female', name
='pokemon_evolution_gender'), nullable
=True)
573 location_id
= Column(Integer
, ForeignKey('locations.id'), nullable
=True)
574 held_item_id
= Column(Integer
, ForeignKey('items.id'), nullable
=True)
575 time_of_day
= Column(Enum('morning', 'day', 'night', name
='pokemon_evolution_time_of_day'), nullable
=True)
576 known_move_id
= Column(Integer
, ForeignKey('moves.id'), nullable
=True)
577 minimum_happiness
= Column(Integer
, nullable
=True)
578 minimum_beauty
= Column(Integer
, nullable
=True)
579 relative_physical_stats
= Column(Integer
, nullable
=True)
580 party_pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), nullable
=True)
582 class PokemonFlavorText(TableBase
):
583 __tablename__
= 'pokemon_flavor_text'
584 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
585 version_id
= Column(Integer
, ForeignKey('versions.id'), primary_key
=True, nullable
=False, autoincrement
=False)
586 flavor_text
= Column(Unicode(255), nullable
=False)
588 class PokemonFormGroup(TableBase
):
589 __tablename__
= 'pokemon_form_groups'
590 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
591 is_battle_only
= Column(Boolean
, nullable
=False)
592 description
= Column(markdown
.MarkdownColumn(1024), nullable
=False)
594 class PokemonFormSprite(TableBase
):
595 __tablename__
= 'pokemon_form_sprites'
596 id = Column(Integer
, primary_key
=True, nullable
=False)
597 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
598 introduced_in_version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False)
599 name
= Column(Unicode(16), nullable
=True)
600 is_default
= Column(Boolean
, nullable
=True)
602 class PokemonHabitat(TableBase
):
603 __tablename__
= 'pokemon_habitats'
604 id = Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False)
605 name
= Column(Unicode(16), nullable
=False)
607 class PokemonInternalID(TableBase
):
608 __tablename__
= 'pokemon_internal_ids'
609 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, autoincrement
=False, nullable
=False)
610 generation_id
= Column(Integer
, ForeignKey('generations.id'), primary_key
=True, autoincrement
=False, nullable
=False)
611 internal_id
= Column(Integer
, nullable
=False)
613 class PokemonItem(TableBase
):
614 __tablename__
= 'pokemon_items'
615 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
616 version_id
= Column(Integer
, ForeignKey('versions.id'), primary_key
=True, nullable
=False, autoincrement
=False)
617 item_id
= Column(Integer
, ForeignKey('items.id'), primary_key
=True, nullable
=False, autoincrement
=False)
618 rarity
= Column(Integer
, nullable
=False)
620 class PokemonMove(TableBase
):
621 __tablename__
= 'pokemon_moves'
622 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), nullable
=False, index
=True)
623 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), nullable
=False, index
=True)
624 move_id
= Column(Integer
, ForeignKey('moves.id'), nullable
=False, index
=True)
625 pokemon_move_method_id
= Column(Integer
, ForeignKey('pokemon_move_methods.id'), nullable
=False, index
=True)
626 level
= Column(Integer
, nullable
=True, index
=True)
627 order
= Column(Integer
, nullable
=True)
630 PrimaryKeyConstraint('pokemon_id', 'version_group_id', 'move_id', 'pokemon_move_method_id', 'level'),
634 class PokemonMoveMethod(TableBase
):
635 __tablename__
= 'pokemon_move_methods'
636 id = Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False)
637 name
= Column(Unicode(64), nullable
=False)
638 description
= Column(Unicode(255), nullable
=False)
640 class PokemonName(TableBase
):
641 __tablename__
= 'pokemon_names'
642 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
643 language_id
= Column(Integer
, ForeignKey('languages.id'), primary_key
=True, nullable
=False, autoincrement
=False)
644 name
= Column(Unicode(16), nullable
=False)
646 class PokemonShape(TableBase
):
647 __tablename__
= 'pokemon_shapes'
648 id = Column(Integer
, primary_key
=True, nullable
=False)
649 name
= Column(Unicode(24), nullable
=False)
650 awesome_name
= Column(Unicode(16), nullable
=False)
652 class PokemonStat(TableBase
):
653 __tablename__
= 'pokemon_stats'
654 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
655 stat_id
= Column(Integer
, ForeignKey('stats.id'), primary_key
=True, nullable
=False, autoincrement
=False)
656 base_stat
= Column(Integer
, nullable
=False)
657 effort
= Column(Integer
, nullable
=False)
659 class PokemonType(TableBase
):
660 __tablename__
= 'pokemon_types'
661 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
662 type_id
= Column(Integer
, ForeignKey('types.id'), nullable
=False)
663 slot
= Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False)
665 class Region(TableBase
):
666 """Major areas of the world: Kanto, Johto, etc."""
667 __tablename__
= 'regions'
668 id = Column(Integer
, primary_key
=True, nullable
=False)
669 name
= Column(Unicode(16), nullable
=False)
671 class Stat(TableBase
):
672 __tablename__
= 'stats'
673 id = Column(Integer
, primary_key
=True, nullable
=False)
674 damage_class_id
= Column(Integer
, ForeignKey('move_damage_classes.id'), nullable
=True)
675 name
= Column(Unicode(16), nullable
=False)
677 class SuperContestCombo(TableBase
):
678 __tablename__
= 'super_contest_combos'
679 first_move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
680 second_move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
682 class SuperContestEffect(TableBase
):
683 __tablename__
= 'super_contest_effects'
684 id = Column(Integer
, primary_key
=True, nullable
=False)
685 appeal
= Column(SmallInteger
, nullable
=False)
686 flavor_text
= Column(Unicode(64), nullable
=False)
688 class TypeEfficacy(TableBase
):
689 __tablename__
= 'type_efficacy'
690 damage_type_id
= Column(Integer
, ForeignKey('types.id'), primary_key
=True, nullable
=False, autoincrement
=False)
691 target_type_id
= Column(Integer
, ForeignKey('types.id'), primary_key
=True, nullable
=False, autoincrement
=False)
692 damage_factor
= Column(Integer
, nullable
=False)
694 class Type(TableBase
):
695 __tablename__
= 'types'
696 __singlename__
= 'type'
697 id = Column(Integer
, primary_key
=True, nullable
=False)
698 name
= Column(Unicode(8), nullable
=False)
699 abbreviation
= Column(Unicode(3), nullable
=False)
700 generation_id
= Column(Integer
, ForeignKey('generations.id'), nullable
=False)
701 damage_class_id
= Column(Integer
, ForeignKey('move_damage_classes.id'), nullable
=False) ## ??? is none; everything else is physical or special
703 class TypeName(TableBase
):
704 __tablename__
= 'type_names'
705 type_id
= Column(Integer
, ForeignKey('types.id'), primary_key
=True, nullable
=False, autoincrement
=False)
706 language_id
= Column(Integer
, ForeignKey('languages.id'), primary_key
=True, nullable
=False, autoincrement
=False)
707 name
= Column(Unicode(16), nullable
=False)
709 class VersionGroup(TableBase
):
710 __tablename__
= 'version_groups'
711 id = Column(Integer
, primary_key
=True, nullable
=False)
712 generation_id
= Column(Integer
, ForeignKey('generations.id'), nullable
=False)
714 class VersionGroupRegion(TableBase
):
715 __tablename__
= 'version_group_regions'
716 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False)
717 region_id
= Column(Integer
, ForeignKey('regions.id'), primary_key
=True, nullable
=False)
719 class Version(TableBase
):
720 __tablename__
= 'versions'
721 id = Column(Integer
, primary_key
=True, nullable
=False)
722 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), nullable
=False)
723 name
= Column(Unicode(32), nullable
=False)
726 ### Relations down here, to avoid ordering problems
727 Ability
.flavor_text
= relation(AbilityFlavorText
, order_by
=AbilityFlavorText
.version_group_id
, backref
='ability')
728 Ability
.foreign_names
= relation(AbilityName
, backref
='ability')
729 Ability
.generation
= relation(Generation
, backref
='abilities')
731 AbilityFlavorText
.version_group
= relation(VersionGroup
)
733 AbilityName
.language
= relation(Language
)
735 Berry
.berry_firmness
= relation(BerryFirmness
, backref
='berries')
736 Berry
.firmness
= association_proxy('berry_firmness', 'name')
737 Berry
.flavors
= relation(BerryFlavor
, order_by
=BerryFlavor
.contest_type_id
, backref
='berry')
738 Berry
.natural_gift_type
= relation(Type
)
740 BerryFlavor
.contest_type
= relation(ContestType
)
742 ContestCombo
.first
= relation(Move
, primaryjoin
=ContestCombo
.first_move_id
==Move
.id,
743 backref
='contest_combo_first')
744 ContestCombo
.second
= relation(Move
, primaryjoin
=ContestCombo
.second_move_id
==Move
.id,
745 backref
='contest_combo_second')
747 Encounter
.location_area
= relation(LocationArea
, backref
='encounters')
748 Encounter
.pokemon
= relation(Pokemon
, backref
='encounters')
749 Encounter
.version
= relation(Version
, backref
='encounters')
750 Encounter
.slot
= relation(EncounterSlot
, backref
='encounters')
752 EncounterConditionValue
.condition
= relation(EncounterCondition
, backref
='values')
754 Encounter
.condition_value_map
= relation(EncounterConditionValueMap
, backref
='encounter')
755 Encounter
.condition_values
= association_proxy('condition_value_map', 'condition_value')
756 EncounterConditionValueMap
.condition_value
= relation(EncounterConditionValue
,
757 backref
='encounter_map')
759 EncounterSlot
.terrain
= relation(EncounterTerrain
, backref
='slots')
761 EncounterSlot
.condition_map
= relation(EncounterSlotCondition
, backref
='slot')
762 EncounterSlot
.conditions
= association_proxy('condition_map', 'condition')
763 EncounterSlotCondition
.condition
= relation(EncounterCondition
,
766 EvolutionChain
.growth_rate
= relation(GrowthRate
, backref
='evolution_chains')
767 EvolutionChain
.baby_trigger_item
= relation(Item
, backref
='evolution_chains')
769 Experience
.growth_rate
= relation(GrowthRate
, backref
='experience_table')
771 Generation
.canonical_pokedex
= relation(Pokedex
, backref
='canonical_for_generation')
772 Generation
.versions
= relation(Version
, secondary
=VersionGroup
.__table__
)
773 Generation
.main_region
= relation(Region
)
775 GrowthRate
.max_experience_obj
= relation(Experience
, primaryjoin
=and_(Experience
.growth_rate_id
== GrowthRate
.id, Experience
.level
== 100), uselist
=False)
776 GrowthRate
.max_experience
= association_proxy('max_experience_obj', 'experience')
778 Item
.berry
= relation(Berry
, uselist
=False, backref
='item')
779 Item
.flags
= relation(ItemFlag
, secondary
=ItemFlagMap
.__table__
)
780 Item
.flavor_text
= relation(ItemFlavorText
, order_by
=ItemFlavorText
.version_group_id
.asc(), backref
='item')
781 Item
.fling_effect
= relation(ItemFlingEffect
, backref
='items')
782 Item
.foreign_names
= relation(ItemName
, backref
='item')
783 Item
.machines
= relation(Machine
, order_by
=Machine
.version_group_id
.asc())
784 Item
.category
= relation(ItemCategory
)
785 Item
.pocket
= association_proxy('category', 'pocket')
787 ItemCategory
.items
= relation(Item
, order_by
=Item
.name
)
788 ItemCategory
.pocket
= relation(ItemPocket
)
790 ItemFlavorText
.version_group
= relation(VersionGroup
)
792 ItemInternalID
.item
= relation(Item
, backref
='internal_ids')
793 ItemInternalID
.generation
= relation(Generation
)
795 ItemName
.language
= relation(Language
)
797 ItemPocket
.categories
= relation(ItemCategory
, order_by
=ItemCategory
.name
)
799 Location
.region
= relation(Region
, backref
='locations')
801 LocationArea
.location
= relation(Location
, backref
='areas')
803 LocationInternalID
.location
= relation(Location
, backref
='internal_ids')
804 LocationInternalID
.generation
= relation(Generation
)
806 Machine
.item
= relation(Item
)
807 Machine
.version_group
= relation(VersionGroup
)
809 Move
.contest_effect
= relation(ContestEffect
, backref
='moves')
810 Move
.contest_combo_next
= association_proxy('contest_combo_first', 'second')
811 Move
.contest_combo_prev
= association_proxy('contest_combo_second', 'first')
812 Move
.contest_type
= relation(ContestType
, backref
='moves')
813 Move
.damage_class
= relation(MoveDamageClass
, backref
='moves')
814 Move
.flags
= association_proxy('move_flags', 'flag')
815 Move
.flavor_text
= relation(MoveFlavorText
, order_by
=MoveFlavorText
.version_group_id
, backref
='move')
816 Move
.foreign_names
= relation(MoveName
, backref
='move')
817 Move
.generation
= relation(Generation
, backref
='moves')
818 Move
.machines
= relation(Machine
, backref
='move')
819 Move
.move_effect
= relation(MoveEffect
, backref
='moves')
820 Move
.move_flags
= relation(MoveFlag
, backref
='move')
821 Move
.super_contest_effect
= relation(SuperContestEffect
, backref
='moves')
822 Move
.super_contest_combo_next
= association_proxy('super_contest_combo_first', 'second')
823 Move
.super_contest_combo_prev
= association_proxy('super_contest_combo_second', 'first')
824 Move
.target
= relation(MoveTarget
, backref
='moves')
825 Move
.type = relation(Type
, backref
='moves')
827 Move
.effect
= markdown
.MoveEffectProperty('effect')
828 Move
.short_effect
= markdown
.MoveEffectProperty('short_effect')
830 MoveEffect
.category_map
= relation(MoveEffectCategoryMap
)
831 MoveEffect
.categories
= association_proxy('category_map', 'category')
832 MoveEffectCategoryMap
.category
= relation(MoveEffectCategory
)
834 MoveFlag
.flag
= relation(MoveFlagType
)
836 MoveFlavorText
.version_group
= relation(VersionGroup
)
838 MoveName
.language
= relation(Language
)
840 Nature
.foreign_names
= relation(NatureName
, backref
='nature')
841 Nature
.decreased_stat
= relation(Stat
, primaryjoin
=Nature
.decreased_stat_id
==Stat
.id,
842 backref
='decreasing_natures')
843 Nature
.increased_stat
= relation(Stat
, primaryjoin
=Nature
.increased_stat_id
==Stat
.id,
844 backref
='increasing_natures')
845 Nature
.hates_flavor
= relation(ContestType
, primaryjoin
=Nature
.hates_flavor_id
==ContestType
.id,
846 backref
='hating_natures')
847 Nature
.likes_flavor
= relation(ContestType
, primaryjoin
=Nature
.likes_flavor_id
==ContestType
.id,
848 backref
='liking_natures')
849 Nature
.battle_style_preferences
= relation(NatureBattleStylePreference
,
850 order_by
=NatureBattleStylePreference
.move_battle_style_id
,
852 Nature
.pokeathlon_effects
= relation(NaturePokeathlonStat
, order_by
=NaturePokeathlonStat
.pokeathlon_stat_id
)
854 NatureBattleStylePreference
.battle_style
= relation(MoveBattleStyle
, backref
='nature_preferences')
856 NatureName
.language
= relation(Language
)
858 NaturePokeathlonStat
.pokeathlon_stat
= relation(PokeathlonStat
, backref
='nature_effects')
860 Pokedex
.region
= relation(Region
, backref
='pokedexes')
861 Pokedex
.version_groups
= relation(VersionGroup
, secondary
=PokedexVersionGroup
.__table__
, backref
='pokedexes')
863 Pokemon
.abilities
= relation(Ability
, secondary
=PokemonAbility
.__table__
,
864 order_by
=PokemonAbility
.slot
,
866 Pokemon
.formes
= relation(Pokemon
, primaryjoin
=Pokemon
.id==Pokemon
.forme_base_pokemon_id
,
867 backref
=backref('forme_base_pokemon',
868 remote_side
=[Pokemon
.id]))
869 Pokemon
.pokemon_color
= relation(PokemonColor
, backref
='pokemon')
870 Pokemon
.color
= association_proxy('pokemon_color', 'name')
871 Pokemon
.dex_numbers
= relation(PokemonDexNumber
, order_by
=PokemonDexNumber
.pokedex_id
.asc(), backref
='pokemon')
872 Pokemon
.default_form_sprite
= relation(PokemonFormSprite
,
874 Pokemon
.id==PokemonFormSprite
.pokemon_id
,
875 PokemonFormSprite
.is_default
==True,
878 Pokemon
.egg_groups
= relation(EggGroup
, secondary
=PokemonEggGroup
.__table__
,
879 order_by
=PokemonEggGroup
.egg_group_id
,
881 Pokemon
.evolution_chain
= relation(EvolutionChain
, backref
='pokemon')
882 Pokemon
.child_pokemon
= relation(Pokemon
,
883 primaryjoin
=Pokemon
.id==PokemonEvolution
.from_pokemon_id
,
884 secondary
=PokemonEvolution
.__table__
,
885 secondaryjoin
=PokemonEvolution
.to_pokemon_id
==Pokemon
.id,
886 backref
=backref('parent_pokemon', uselist
=False),
888 Pokemon
.flavor_text
= relation(PokemonFlavorText
, order_by
=PokemonFlavorText
.version_id
.asc(), backref
='pokemon')
889 Pokemon
.foreign_names
= relation(PokemonName
, backref
='pokemon')
890 Pokemon
.pokemon_habitat
= relation(PokemonHabitat
, backref
='pokemon')
891 Pokemon
.habitat
= association_proxy('pokemon_habitat', 'name')
892 Pokemon
.items
= relation(PokemonItem
, backref
='pokemon')
893 Pokemon
.generation
= relation(Generation
, backref
='pokemon')
894 Pokemon
.shape
= relation(PokemonShape
, backref
='pokemon')
895 Pokemon
.stats
= relation(PokemonStat
, backref
='pokemon', order_by
=PokemonStat
.stat_id
.asc())
896 Pokemon
.types
= relation(Type
, secondary
=PokemonType
.__table__
, order_by
=PokemonType
.slot
.asc())
898 PokemonDexNumber
.pokedex
= relation(Pokedex
)
900 PokemonEvolution
.from_pokemon
= relation(Pokemon
,
901 primaryjoin
=PokemonEvolution
.from_pokemon_id
==Pokemon
.id,
902 backref
='child_evolutions',
904 PokemonEvolution
.to_pokemon
= relation(Pokemon
,
905 primaryjoin
=PokemonEvolution
.to_pokemon_id
==Pokemon
.id,
906 backref
=backref('parent_evolution', uselist
=False),
908 PokemonEvolution
.child_evolutions
= relation(PokemonEvolution
,
909 primaryjoin
=PokemonEvolution
.from_pokemon_id
==PokemonEvolution
.to_pokemon_id
,
910 foreign_keys
=[PokemonEvolution
.to_pokemon_id
],
911 backref
=backref('parent_evolution',
912 remote_side
=[PokemonEvolution
.from_pokemon_id
],
916 PokemonEvolution
.trigger
= relation(EvolutionTrigger
, backref
='evolutions')
917 PokemonEvolution
.trigger_item
= relation(Item
,
918 primaryjoin
=PokemonEvolution
.trigger_item_id
==Item
.id,
919 backref
='triggered_evolutions',
921 PokemonEvolution
.held_item
= relation(Item
,
922 primaryjoin
=PokemonEvolution
.held_item_id
==Item
.id,
923 backref
='required_for_evolutions',
925 PokemonEvolution
.location
= relation(Location
, backref
='triggered_evolutions')
926 PokemonEvolution
.known_move
= relation(Move
, backref
='triggered_evolutions')
927 PokemonEvolution
.party_pokemon
= relation(Pokemon
,
928 primaryjoin
=PokemonEvolution
.party_pokemon_id
==Pokemon
.id,
929 backref
='triggered_evolutions',
932 PokemonFlavorText
.version
= relation(Version
)
934 PokemonItem
.item
= relation(Item
, backref
='pokemon')
935 PokemonItem
.version
= relation(Version
)
937 PokemonFormGroup
.pokemon
= relation(Pokemon
, backref
=backref('form_group',
939 PokemonFormSprite
.pokemon
= relation(Pokemon
, backref
='form_sprites')
940 PokemonFormSprite
.introduced_in
= relation(VersionGroup
)
942 PokemonMove
.pokemon
= relation(Pokemon
, backref
='pokemon_moves')
943 PokemonMove
.version_group
= relation(VersionGroup
)
944 PokemonMove
.machine
= relation(Machine
, backref
='pokemon_moves',
945 primaryjoin
=and_(Machine
.version_group_id
==PokemonMove
.version_group_id
,
946 Machine
.move_id
==PokemonMove
.move_id
),
947 foreign_keys
=[Machine
.version_group_id
, Machine
.move_id
],
949 PokemonMove
.move
= relation(Move
, backref
='pokemon_moves')
950 PokemonMove
.method
= relation(PokemonMoveMethod
)
952 PokemonName
.language
= relation(Language
)
954 PokemonStat
.stat
= relation(Stat
)
956 # This is technically a has-many; Generation.main_region_id -> Region.id
957 Region
.generation
= relation(Generation
, uselist
=False)
958 Region
.version_group_regions
= relation(VersionGroupRegion
, backref
='region',
959 order_by
='VersionGroupRegion.version_group_id')
960 Region
.version_groups
= association_proxy('version_group_regions', 'version_group')
962 Stat
.damage_class
= relation(MoveDamageClass
, backref
='stats')
964 SuperContestCombo
.first
= relation(Move
, primaryjoin
=SuperContestCombo
.first_move_id
==Move
.id,
965 backref
='super_contest_combo_first')
966 SuperContestCombo
.second
= relation(Move
, primaryjoin
=SuperContestCombo
.second_move_id
==Move
.id,
967 backref
='super_contest_combo_second')
969 Type
.damage_efficacies
= relation(TypeEfficacy
,
971 ==TypeEfficacy
.damage_type_id
,
972 backref
='damage_type')
973 Type
.target_efficacies
= relation(TypeEfficacy
,
975 ==TypeEfficacy
.target_type_id
,
976 backref
='target_type')
978 Type
.generation
= relation(Generation
, backref
='types')
979 Type
.damage_class
= relation(MoveDamageClass
, backref
='types')
980 Type
.foreign_names
= relation(TypeName
, backref
='type')
982 TypeName
.language
= relation(Language
)
984 Version
.version_group
= relation(VersionGroup
, backref
='versions')
985 Version
.generation
= association_proxy('version_group', 'generation')
987 VersionGroup
.generation
= relation(Generation
, backref
='version_groups')
988 VersionGroup
.version_group_regions
= relation(VersionGroupRegion
, backref
='version_group')
989 VersionGroup
.regions
= association_proxy('version_group_regions', 'region')