468,790 Members | 1,819 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,790 developers. It's quick & easy.

Postgresql database creating error python code

2 2Bits
I have a old code for unity3d game.
I was able to update it from 2.7 to python 3.
After running the code as shown below:
Expand|Select|Wrap|Line Numbers
  1. from flask import Flask
  2. #from flask.ext.sqlalchemy import SQLAlchemy
  3. from flask_sqlalchemy import SQLAlchemy
  4.  
  5. from sqlalchemy.ext.declarative import declarative_base
  6. from sqlalchemy import Column, Sequence, Integer, Float, String, Boolean, ForeignKey, TIMESTAMP, Enum
  7. import datetime
  8. from os import urandom
  9. from binascii import hexlify
  10. from hashlib import sha1
  11.  
  12.  
  13. app = Flask(__name__)
  14. app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://postgres:neljaD44@localhost'
  15. db = SQLAlchemy(app)
  16.  
  17. class GameServer(db.Model):
  18.     __tablename__ = 'servers'
  19.  
  20.     id = Column( Integer, Sequence( "gameserver_id_seq" ), primary_key=True, autoincrement=True )
  21.     host = Column( String(64) )
  22.     port = Column( String(10) )
  23.     fe_username = Column( String(64) )
  24.     fe_password = Column( String(64) )
  25.  
  26.     def __init__(self, host, port, username, password ):
  27.         self.host = host
  28.         self.port = port
  29.         self.fe_username = username
  30.         self.fe_password = password
  31.  
  32.     def __repr__(self):
  33.         return "<GameServer %s:%s>" % (self.host, self.port)
  34.  
  35.  
  36. class UserSession(db.Model):
  37.     __tablename__ = 'sessions'
  38.  
  39.     session_id = Column( String(64), primary_key=True, autoincrement=True )
  40.     user_id = Column( Integer )
  41.     created = Column( TIMESTAMP( timezone=True ) )
  42.  
  43.     def __init__(self, user_id, session_id, created = None ):
  44.         self.session_id = session_id
  45.         self.user_id = user_id
  46.         self.created = created
  47.         if created is None:
  48.             self.created = datetime.datetime.now()
  49.  
  50.     def __repr__(self):
  51.         return "<Session for user id %d created on %s>" % (self.user_id, str(self.created) )
  52.  
  53.  
  54. class User(db.Model):
  55.     """
  56.     ALTER TABLE users ADD COLUMN steam_id varchar(32);
  57.     """
  58.     __tablename__ = 'users'
  59.  
  60.     id = Column( Integer, primary_key=True, autoincrement=True )
  61.     username = Column( String(64) )
  62.     screenname = Column( String(64) )
  63.     password_hash = Column( String )
  64.     clantag = Column( String(10) )
  65.     allow_login = Column( Boolean )
  66.     account_type = Column( Integer )
  67.     rating = Column( Integer )    # this lives here for now until we move it to a proper player statistics table
  68.     email = Column( String(128) )
  69.     is_online = Column( Boolean )
  70.     steam_id = Column( String(32) )
  71.  
  72.     def __init__( self, username ):
  73.         self.username = username
  74.         self.is_online = False
  75.  
  76.     def __repr__(self):
  77.         return "<User %s/%s>" % (self.username, self.screenname)
  78.  
  79.  
  80. class UserInventoryItem(db.Model):
  81.     """
  82.     CHANGED 140207: ALTER TABLE user_inventory ADD COLUMN suit varchar(10) NOT NULL;
  83.     CHANGED 140207: ALTER TABLE user_inventory ADD COLUMN is_new boolean NOT NULL default TRUE;
  84.     """
  85.     __tablename__ = "user_inventory"
  86.  
  87.     id = Column( Integer, primary_key=True, autoincrement=True )
  88.     user_id = Column( Integer, primary_key=True )
  89.     item_category = Column( String(16), primary_key=True )
  90.     item_id = Column( Integer )
  91.     slot = Column( Integer )
  92.     item_name = Column( String(64) )
  93.     suit = Column( String(10), nullable=False )
  94.     is_new = Column( Boolean, nullable=False )
  95.  
  96.     def __init__( self, user_id, item_category, item_id, suit, item_name = "", slot=-1 ):
  97.         self.user_id = user_id
  98.         self.item_category = item_category
  99.         self.item_id = item_id
  100.         self.item_name = ""
  101.         self.slot = slot
  102.         self.suit = suit
  103.         self.is_new = True
  104.  
  105.  
  106. class UserPossession(db.Model):
  107.     """
  108. CREATE SEQUENCE user_possessions_seq;
  109.  
  110. CREATE TABLE user_possessions(
  111.     id integer not null unique default nextval('user_possessions_seq'::regclass),
  112.     user_id integer not null,
  113.     p_type varchar(16) not null,
  114.     p_item varchar(32) not null,
  115.  
  116.     grant_information varchar(32),
  117.  
  118.     primary key( id, user_id ),
  119.     foreign key( user_id ) references users(id)
  120. );
  121.     """
  122.     __tablename__ = "user_possessions"
  123.  
  124.     id = Column( Integer, primary_key=True, autoincrement=True )
  125.     user_id = Column( Integer, primary_key=True )
  126.     p_type = Column( String(16), nullable=False, primary_key=True )
  127.     p_item = Column( String(32) )
  128.     grant_information = Column( String(32) )
  129.  
  130.     def __init__(self, user_id, p_type, p_item, grant_info = ""  ):
  131.         self.user_id = user_id
  132.         self.p_type = p_type
  133.         self.p_item = p_item
  134.         self.grant_information = grant_info
  135.  
  136. class UserBooster(db.Model):
  137.     """
  138. CREATE SEQUENCE user_boosters_seq;
  139.  
  140. CREATE TABLE user_boosters(
  141.     id integer not null unique default nextval('user_boosters_seq'::regclass),
  142.     user_id integer not null,
  143.  
  144.     booster_type varchar(16) not null,
  145.     multiplier float not null,
  146.  
  147.     grant_timestamp timestamp with time zone,
  148.     expiry_timestamp timestamp with time zone,
  149.  
  150.     grant_information varchar(64),
  151.  
  152.     primary key( id, user_id, booster_type ),
  153.     foreign key( user_id ) references users(id)
  154.  
  155.  
  156. );
  157. """
  158.     __tablename__ = "user_boosters"
  159.  
  160.     id = Column( Integer, primary_key=True, autoincrement=True )
  161.     user_id = Column( Integer, primary_key=True )
  162.  
  163.     booster_type = Column( String(16), nullable=False, primary_key=True )
  164.     multiplier = Column( Float, nullable=False )
  165.  
  166.     grant_timestamp = Column( TIMESTAMP( timezone=True ) )
  167.     expiry_timestamp = Column( TIMESTAMP( timezone=True ) )
  168.  
  169.     grant_information = Column( String(64) )
  170.  
  171.     def __init__(self, user_id, booster_type, booster_multiplier, expiry_timestamp, grant_info = "" ):
  172.         self.user_id = user_id
  173.         self.booster_type = booster_type
  174.         self.multiplier = booster_multiplier
  175.  
  176.         self.grant_timestamp = datetime.datetime.now()
  177.         self.expiry_timestamp = expiry_timestamp
  178.         self.grant_information = grant_info
  179.         pass
  180.  
  181.  
  182. class UserStats(db.Model):
  183.     """
  184.     CHANGED 140129: ALTER TABLE user_stats ADD COLUMN ladder_value float NOT NULL default 13.0;
  185.     CHANGED 140213: UPDATE user_stats SET xp_level=1, xp_current=0, xp_next=212, hard_money=0, soft_money=0, rating=1500; /* reset */
  186.     """
  187.     __tablename__ = "user_stats"
  188.  
  189.     id = Column( Integer, primary_key=True, autoincrement=True )
  190.     user_id = Column( Integer )
  191.  
  192.     xp_level = Column( Integer )
  193.     xp_current = Column( Integer )
  194.     xp_next = Column( Integer )
  195.     xp_rested = Column( Integer )
  196.     rating = Column( Integer )
  197.     ladder_value = Column( Float )
  198.  
  199.     soft_money = Column( Integer )
  200.     hard_money = Column( Integer )
  201.  
  202.     def __init__(self, userid):
  203.         self.user_id = userid
  204.         self.xp_level = 1
  205.         self.xp_current = 0
  206.         self.xp_next = 212
  207.         self.xp_rested = 0
  208.         self.rating = 1500
  209.         self.hard_money = 0
  210.         self.soft_money = 1500
  211.         self.ladder_value = 13.0
  212.  
  213.  
  214. class UserStatEvent(db.Model):
  215.     """
  216.     CHANGED 140129: ALTER TABLE user_stat_events ADD COLUMN old_value integer NOT NULL DEFAULT -1;
  217.     """
  218.  
  219.     __tablename__ = "user_stat_events"
  220.  
  221.     id = Column( Integer, primary_key=True, autoincrement=True )
  222.     user_id = Column( Integer, primary_key=True )
  223.  
  224.     created = Column( TIMESTAMP( timezone=True ) )
  225.  
  226.     field_name = Column( String(32), nullable=False )
  227.     old_value = Column( Integer, nullable=False, default=-1)
  228.     change_type = Column( String(32), nullable=False )
  229.     change_amount = Column( Integer, nullable=False )
  230.  
  231.     match_token = Column( String(64) )
  232.     inapp_transaction_id = Column( String(128) )
  233.  
  234.     description = Column( String )
  235.  
  236.     def __repr__(self):
  237.         return "<UserStatEvent for user id %d: %s %s %d>" % (self.user_id, self.field_name, self.change_type, self.change_amount)
  238.  
  239.     def __init__(self, user_id, field_name, change_type, amount, old_value = -1 ):
  240.         self.user_id = user_id
  241.         self.created = datetime.datetime.now()
  242.         self.field_name = field_name
  243.         self.change_type = change_type
  244.         self.change_amount = amount
  245.         self.old_value = old_value
  246.  
  247.  
  248. #class FriendRequest(Base):
  249. #    def __init__(self):
  250. #        pass
  251.  
  252.  
  253. #class FriendAssociation(Base):
  254. #    def __init__(self):
  255. #       pass
  256.  
  257.  
  258. class Match(db.Model):
  259.     __tablename__ = 'match'
  260.  
  261.     id = Column( Integer, Sequence( "match_id_seq" ), primary_key=True, autoincrement=True )
  262.     token = Column( String(64) )
  263.     map = Column( String(64) )
  264.     server_id = Column( Integer )
  265.     status = Column( Integer )
  266.     result = Column( Integer )
  267.     creation_time = Column( TIMESTAMP( timezone = True ) )
  268.     match_type = Column( Integer )
  269.     start_time = Column( TIMESTAMP( timezone = True ) )
  270.     end_time = Column( TIMESTAMP( timezone = True ) )
  271.  
  272.     def __init__(self, map, match_type ):
  273.         mid = urandom(32)
  274.         mid_str = ":".join("{0:x}".format(ord(c)) for c in mid)
  275.         self.token = sha1(u'%s%s' % (mid_str, map)).hexdigest()
  276.         self.map = map
  277.         self.server_id = 0
  278.         self.status = 0
  279.         self.result = 0
  280.         self.creation_time = datetime.datetime.now()
  281.         self.match_type = 1
  282.         self.start_time = datetime.datetime( 1970, 1, 1 )
  283.         self.end_time = datetime.datetime( 1970, 1, 1 )
  284.  
  285.     def __repr__(self):
  286.         return "<Match %s in state %d>" % (self.token, self.status)
  287.  
  288. class MatchBasicInfo(db.Model):
  289.     """
  290. CREATE SEQUENCE match_basic_infos_seq;
  291.  
  292. CREATE TABLE match_basic_infos(
  293.     id integer not null unique default nextval('match_basic_infos_seq'::regclass),
  294.     match_id integer not null,
  295.     type_string varchar(16) not null,
  296.     tickets integer not null,
  297.     duration integer not null,
  298.     winning_team integer,
  299.     tickets_team1 integer,
  300.     tickets_team2 integer,
  301.  
  302.     primary key (id),
  303.     foreign key (match_id) references match(id) on delete restrict
  304. );
  305.     """
  306.     id = Column( Integer, primary_key=True, autoincrement=True )
  307.     match_id = Column( Integer, ForeignKey( "match.id" ), nullable=False, primary_key=True )
  308.     type_string = Column( String(16), nullable=False )
  309.     tickets = Column( Integer, nullable=False )
  310.     duration = Column( Integer, nullable=False )
  311.     winning_team = Column( Integer )
  312.     tickets_team1 = Column( Integer )
  313.     tickets_team2 = Column( Integer )
  314.  
  315.     __tablename__ = 'match_basic_infos'
  316.     def __init__(self, match_id, type_string, tickets, duration ):
  317.         self.match_id = match_id
  318.         self.type_string = type_string
  319.         self.tickets = tickets
  320.         self.tickets_team1 = tickets
  321.         self.tickets_team2 = tickets
  322.         self.duration = duration
  323.         self.winning_team = -1
  324.  
  325. class MatchPlayerInfo(db.Model):
  326.     """
  327. CREATE SEQUENCE match_player_infos_seq;
  328.  
  329. CREATE TABLE match_player_infos(
  330.     id integer not null unique default nextval('match_player_infos_seq'::regclass),
  331.     match_id integer not null,
  332.     player_id integer,
  333.     player_match_index integer,
  334.     player_name varchar(64) not null,
  335.     rank float,
  336.     human boolean,
  337.     team integer,
  338.     hero integer,
  339.     role varchar(16),
  340.     level integer,
  341.     total_experience integer,
  342.     kills integer,
  343.     creep_kills integer,
  344.     deaths integer,
  345.     captures integer,
  346.     gold_collected integer,
  347.     total_damage_out integer,
  348.     total_damage_in integer,
  349.     potions_collected integer,
  350.  
  351.     primary key (match_id, id),
  352.     foreign key(match_id) references match(id) on delete restrict
  353. );
  354.     """
  355.     id = Column( Integer, primary_key=True, autoincrement=True )
  356.     match_id = Column( Integer, ForeignKey( "match.id" ), nullable=False, primary_key=True )
  357.     player_id = Column( Integer )
  358.     player_match_index = Column( Integer )
  359.     player_name = Column( String(64), nullable=False )
  360.     rank = Column( Float )
  361.     human = Column( Boolean )
  362.     team = Column( Integer )
  363.     hero = Column( Integer )
  364.     role = Column( String(16) )
  365.     level = Column( Integer )
  366.     total_experience = Column( Integer )
  367.     kills = Column( Integer )
  368.     creep_kills = Column( Integer )
  369.     deaths = Column( Integer )
  370.     captures = Column( Integer )
  371.     gold_collected = Column( Integer )
  372.     total_damage_out = Column( Integer )
  373.     total_damage_in = Column( Integer )
  374.     potions_collected = Column( Integer )
  375.  
  376.     __tablename__ = 'match_player_infos'
  377.     def __init__(self, match_id, player_id, player_name, team, rank):
  378.         self.match_id = match_id
  379.         self.player_id = player_id
  380.         self.player_name = player_name
  381.         self.team = team
  382.         self.rank = rank
  383.         self.level = 1
  384.         self.total_experience = 0
  385.         self.kills = 0
  386.         self.creep_kills = 0
  387.         self.deaths = 0
  388.         self.captures = 0
  389.         self.gold_collected = 0
  390.         self.total_damage_out = 0
  391.         self.total_damage_in = 0
  392.         self.potions_collected = 0
  393.  
  394.  
  395. class MatchTeamEvent(db.Model):
  396.     """
  397. CREATE SEQUENCE match_team_events_seq;
  398.  
  399. CREATE TABLE match_team_events(
  400.     id integer not null unique default nextval('match_team_events_seq'::regclass),
  401.     match_id integer not null,
  402.     time integer not null,
  403.     team integer not null,
  404.     event varchar(32) not null,
  405.     position_x float,
  406.     position_y float,
  407.     position_z float,
  408.     extra_data_1 varchar(64),
  409.     extra_data_2 varchar(64),
  410.  
  411.     primary key( match_id, id ),
  412.     foreign key(match_id) references match(id) on delete restrict
  413.  
  414. );
  415.     """
  416.     id = Column( Integer, primary_key=True, autoincrement=True )
  417.     match_id = Column( Integer, ForeignKey( "match.id" ), primary_key=True )
  418.     time = Column( Integer )
  419.     team = Column( Integer )
  420.     event = Column( String(32) )
  421.     position_x = Column( Float )
  422.     position_y = Column( Float )
  423.     position_z = Column( Float )
  424.     extra_data_1 = Column( String(64) )
  425.     extra_data_2 = Column( String(64) )
  426.  
  427.     __tablename__ = 'match_team_events'
  428.     def __init__(self, match_id, time, team, event, extra_data_1 = None, extra_data_2 = None, position = None):
  429.         self.match_id = match_id
  430.         self.time = time
  431.         self.team = team
  432.         self.event = event
  433.         if extra_data_1 is not None:
  434.             self.extra_data_1 = extra_data_1
  435.         if extra_data_2 is not None:
  436.             self.extra_data_2 = extra_data_2
  437.         if self.position is not None:
  438.             self.position_x, self.position_y, self.position_z = position
  439.  
  440.  
  441. class MatchPlayerEvent(db.Model):
  442.     """
  443. CREATE SEQUENCE match_player_events_seq;
  444.  
  445. CREATE TABLE match_player_events(
  446.     id integer not null unique default nextval('match_player_events_seq'::regclass),
  447.     match_id integer not null,
  448.     time integer not null,
  449.     player_name varchar(64) not null,
  450.     event varchar(32) not null,
  451.     position_x float,
  452.     position_y float,
  453.     position_z float,
  454.     extra_data_1 varchar(64),
  455.     extra_data_2 varchar(64),
  456.  
  457.     primary key (match_id, id),
  458.     foreign key (match_id) references match(id) on delete restrict
  459. );
  460.     """
  461.     id = Column( Integer, primary_key=True, autoincrement=True )
  462.     match_id = Column( Integer, ForeignKey( "match.id" ), primary_key=True )
  463.     time = Column( Integer )
  464.     player_name = Column( String(64) )
  465.     event = Column( String(32) )
  466.     position_x = Column( Float )
  467.     position_y = Column( Float )
  468.     position_z = Column( Float )
  469.     extra_data_1 = Column( String(64) )
  470.     extra_data_2 = Column( String(64) )
  471.  
  472.     __tablename__ = 'match_player_events'
  473.     def __init__(self, match_id, time, player_name, event, extra_data_1 = None, extra_data_2 = None, position = None ):
  474.         self.match_id = match_id
  475.         self.time = time
  476.         self.player_name = player_name
  477.         self.event = event
  478.         if extra_data_1 is not None:
  479.             self.extra_data_1 = extra_data_1
  480.         if extra_data_2 is not None:
  481.             self.extra_data_2 = extra_data_2
  482.         if self.position is not None:
  483.             self.position_x, self.position_y, self.position_z = position
  484.  
  485.  
  486. class MatchRequest(db.Model):
  487.     __tablename__ = 'match_request'
  488.  
  489.     id = Column( Integer, primary_key=True, autoincrement=True )
  490.     user_id = Column( Integer )
  491.     gametype = Column( String(10), nullable=True )  # Column( Enum( '1v1', '2v2', name="matchrequest_gametype_enum" ) )
  492.     controltype = Column(String(10), nullable=True ) # Column( Enum('master', 'hero'), name="matchrequest_controltype_enum" )
  493.     map_preference = Column( String(64) )
  494.     found_match_id = Column( Integer )
  495.     status = Column( Integer )
  496.     skill_hint = Column( Integer )
  497.     start_time = Column( TIMESTAMP( timezone = True ) )
  498.  
  499.     def __init__(self, user_id ):
  500.         self.user_id = user_id
  501.         self.status = 0
  502.         self.skill_hint = 0
  503.         self.start_time = datetime.datetime.now()
  504.  
  505.     def __repr__(self):
  506.         return "<Match request for user %d>" % (self.user_id,)
  507.  
  508.  
  509. class MatchResult(db.Model):
  510.     """
  511.     CHANGED 140129: ALTER TABLE match_result ADD COLUMN old_ladder float;
  512.                     ALTER TABLE match_result ADD COLUMN new_ladder float;
  513.                     ALTER TABLE match_result ADD COLUMN old_soft_money integer;
  514.                     ALTER TABLE match_result ADD COLUMN new_soft_money integer;
  515.                     ALTER TABLE match_result ADD COLUMN old_hard_money integer;
  516.                     ALTER TABLE match_result ADD COLUMN new_hard_money integer;
  517.  
  518.     """
  519.  
  520.     __tablename__ = 'match_result'
  521.  
  522.     id = Column( Integer, primary_key = True, autoincrement=True )
  523.     user_id = Column( Integer, primary_key=True, nullable=False )
  524.     match_token = Column( String(64), nullable=False )
  525.     result = Column( String(20), nullable=True ) # Column( Enum( 'won', 'lost', 'draw', 'in_progress', 'unfinished', name="matchresult_result_enum" ), nullable=False )
  526.  
  527.     old_xp = Column( Integer )
  528.     new_xp = Column( Integer )
  529.     old_level = Column( Integer )
  530.     new_level = Column( Integer )
  531.     old_rating = Column( Integer )
  532.     new_rating = Column( Integer )
  533.     old_ladder = Column( Float )
  534.     new_ladder = Column( Float )
  535.     old_soft_money = Column( Integer )
  536.     new_soft_money = Column( Integer )
  537.     old_hard_money = Column( Integer )
  538.     new_hard_money = Column( Integer )
  539.  
  540.     end_time = Column( TIMESTAMP( timezone = True ) )
  541.  
  542.     def __repr__(self):
  543.         return "<MatchResult on match %s for userid %d: %s>" % (self.match_token, self.user_id, self.result)
  544.  
  545.     def __init__(self, user_id, match_token, result ):
  546.         self.user_id = user_id
  547.         self.match_token = match_token
  548.         self.result = result
  549.  
  550.  
  551. class BetaFeedback(db.Model):
  552.     __tablename__ = 'beta_feedback'
  553.  
  554.     match_id = Column( String(64), primary_key = True, nullable=False )
  555.     user_id = Column( Integer, primary_key=True, nullable=False )
  556.     rating = Column( Integer, default=0, nullable=False )
  557.     feedback = Column( String(1024), default='', nullable=False )
  558.  
  559.     def __repr__(self):
  560.         return "<Match feedback for match %s>" % (self.match_id,)
  561.  
  562.     def __init__(self, match_id, user_id ):
  563.         self.match_id = match_id
  564.         self.user_id = user_id
  565.         self.rating = 0
  566.         self.feedback = ''
  567.  
  568.  
  569. class BetaInvite(db.Model):
  570.     __tablename__ = 'beta_invites'
  571.  
  572.     beta_key = Column( String(64), primary_key=True, nullable=False )
  573.     email_address = Column( String(128), nullable=False )
  574.     requested_username = Column( String(64), nullable=False )
  575.     consumed = Column( Boolean, default=False)
  576.     email_confirmed = Column( Boolean, default=False )
  577.     created_timestamp = Column( TIMESTAMP( timezone=True ) )
  578.     consumed_timestamp = Column( TIMESTAMP( timezone = True ) )
  579.     email_sent = Column( Boolean, default=False )
  580.     email_confirm_key = Column( String(64), nullable=True )
  581.     requested_password = Column( String(64), nullable=False, default='' )
  582.  
  583.     def __init__(self, beta_key):
  584.         self.beta_key = beta_key
  585.         self.email_address = ''
  586.         self.requested_username = ''
  587.         self.consumed = False
  588.         self.email_confirmed = False
  589.         self.created_timestamp = datetime.datetime.now()
  590.         self.email_sent = False
  591.         self.requested_password = ''
  592.  
  593.  
  594.  
  595. class FriendAssociation(db.Model):
  596.     __tablename__ = "user_friend_assoc"
  597.  
  598.     id = Column( Integer, autoincrement=True, primary_key=True )
  599.     user_id = Column( Integer, primary_key=True )
  600.     friend_id = Column( Integer )
  601.  
  602.     def __init__(self, user_id, friend_id):
  603.         self.user_id = user_id
  604.         self.friend_id = friend_id
  605.  
  606. class FriendRequest(db.Model):
  607.     __tablename__ = "friend_requests"
  608.  
  609.     id = Column( Integer, autoincrement=True, primary_key=True )
  610.     receiver_user_id = Column( Integer, primary_key=True )
  611.     sender_user_id = Column( Integer, primary_key=True )
  612.     accepted = Column( Boolean, default=False )
  613.  
  614.     def __init__(self, user_id, friend_id):
  615.         self.receiver_user_id = friend_id
  616.         self.sender_user_id = user_id
  617.         self.accepted = False
  618.  
  619.  
  620. class GameInvite(db.Model):
  621.     __tablename__ = "friend_game_invites"
  622.  
  623.     id = Column( Integer, autoincrement=True, primary_key=True )
  624.     receiver_user_id = Column( Integer, primary_key=True )
  625.     sender_user_id = Column( Integer )
  626.     map_preference = Column( String(64) )
  627.     accepted = Column( Boolean, default=False )
  628.     game_created = Column( Boolean, default=False )
  629.     match_token = Column( String(64) )
  630.  
  631.     def __init__(self, receiver_id, sender_id ):
  632.         self.receiver_user_id = receiver_id
  633.         self.sender_user_id = sender_id
  634.         self.map_preference = ''
  635.         self.accepted = False
  636.         self.game_created = False
  637.         self.match_token = ''
  638.  
  639.  
  640. class Achievement(db.Model):
  641.     """
  642. CREATE SEQUENCE achievements_id_seq;
  643.  
  644. CREATE TABLE achievements(
  645.     id integer not null unique default nextval('achievements_id_seq'::regclass),
  646.     user_id integer not null,
  647.     achievement_name varchar(32),
  648.     completed timestamp with time zone,
  649.     completion_count integer default 0,
  650.     last_complete_token varchar(64),
  651.  
  652.     primary key ( id, user_id ),
  653.     foreign key ( user_id ) references users(id) on delete cascade
  654. );
  655.     """
  656.     __tablename__ = "achievements"
  657.  
  658.     id = Column( Integer, autoincrement=True, primary_key=True )
  659.     user_id = Column( Integer, primary_key=True )
  660.     achievement_name = Column( String(32) )
  661.     completed = Column( TIMESTAMP( timezone=True ) )
  662.     completion_count = Column( Integer, default=0 )
  663.     last_complete_token = Column( String(64) )
  664.  
  665.     def __init__(self, user_id, achievement, token=""):
  666.         self.user_id = user_id
  667.         self.achievement_name = achievement
  668.         self.completed = datetime.datetime.utcnow()
  669.         self.completion_count = 0
  670.         self.last_complete_token = token
  671.  
  672.  
  673. class LogEntry(db.Model):
  674.     """
  675. CREATE SEQUENCE logentries_id_seq;
  676.  
  677. CREATE TABLE logentries(
  678.  
  679.     id integer not null unique default nextval('logentries_id_seq'::regclass),
  680.     user_id integer not null,
  681.  
  682.     entry_timestamp timestamp with time zone,
  683.     entry_type varchar(32),
  684.     extra_data varchar(256),
  685.  
  686.     primary key (id, user_id),
  687.     foreign key ( user_id ) references users(id) on delete cascade
  688.  
  689. );
  690.     """
  691.     __tablename__ = "logentries"
  692.  
  693.     id = Column( Integer, autoincrement=True, primary_key=True )
  694.     user_id = Column( Integer, ForeignKey( "users.id" ), primary_key=True, nullable=False  )
  695.     entry_timestamp = Column( TIMESTAMP( timezone=True ) )
  696.     entry_type = Column( String(32) )
  697.     extra_data = Column( String(256) )
  698.  
  699.     def __init__(self, user_id, entry_type, extra_data="" ):
  700.         self.user_id = user_id
  701.         self.entry_timestamp = datetime.datetime.now()
  702.         self.entry_type = entry_type
  703.         self.extra_data = extra_data
  704.  
  705.  
  706. class ShopSKU(db.Model):
  707.     """
  708. CREATE SEQUENCE shop_item_skus_id_seq START WITH 1000;
  709.  
  710. CREATE TABLE shop_item_skus(
  711.     id integer not null unique default nextval('shop_item_skus_id_seq'::regclass),
  712.  
  713.     sku_internal_identifier varchar(32) not null unique,
  714.     name varchar(128) not null,
  715.     description varchar(256) not null,
  716.     category varchar(32),
  717.  
  718.     purchaseable boolean not null,
  719.  
  720.     soft_currency_cost integer,
  721.     hard_currency_cost integer,
  722.  
  723.     steam_sellable boolean,
  724.  
  725.     primary key(id)
  726. );
  727.  
  728. INSERT INTO shop_item_skus
  729.   (id, sku_internal_identifier, name, description, category, purchaseable, soft_currency_cost, hard_currency_cost, steam_sellable)
  730. VALUES
  731.   (2001, 'CHARACTER-BEAVER', 'Beaver', 'Beaver hero character', 'character', TRUE, -1, -1, TRUE );
  732.  
  733. INSERT INTO shop_item_skus
  734.   (id, sku_internal_identifier, name, description, category, purchaseable, soft_currency_cost, hard_currency_cost, steam_sellable)
  735. VALUES
  736.   (2002, 'CHARACTER-FYRE', 'Fyre Engineer', 'Fyre Engineer hero character', 'character', TRUE, -1, -1, TRUE );
  737.  
  738. INSERT INTO shop_item_skus
  739.   (id, sku_internal_identifier, name, description, category, purchaseable, soft_currency_cost, hard_currency_cost, steam_sellable)
  740. VALUES
  741.   (2003, 'CHARACTER-ALCHEMIST', 'Alchemist', 'Alchemist hero character', 'character', TRUE, -1, -1, TRUE );
  742.  
  743. INSERT INTO shop_item_skus
  744.   (id, sku_internal_identifier, name, description, category, purchaseable, soft_currency_cost, hard_currency_cost, steam_sellable)
  745. VALUES
  746.   (2004, 'CHARACTER-STONE', 'Stone elemental', 'Stone elemental hero character', 'character', TRUE, -1, -1, TRUE );
  747.  
  748. INSERT INTO shop_item_skus
  749.   (id, sku_internal_identifier, name, description, category, purchaseable, soft_currency_cost, hard_currency_cost, steam_sellable)
  750. VALUES
  751.   (2005, 'CHARACTER-ROGUE', 'Rogue', 'Rogue hero character', 'character', TRUE, -1, -1, TRUE );
  752.  
  753.  
  754. INSERT INTO shop_sku_prices (sku_id, currency, unit_price) VALUES ( 2001, 'EUR', 100 );
  755. INSERT INTO shop_sku_prices (sku_id, currency, unit_price) VALUES ( 2002, 'EUR', 100 );
  756. INSERT INTO shop_sku_prices (sku_id, currency, unit_price) VALUES ( 2003, 'EUR', 100 );
  757. INSERT INTO shop_sku_prices (sku_id, currency, unit_price) VALUES ( 2004, 'EUR', 100 );
  758. INSERT INTO shop_sku_prices (sku_id, currency, unit_price) VALUES ( 2005, 'EUR', 100 );
  759.     """
  760.     __tablename__ = "shop_item_skus"
  761.  
  762.     id = Column( Integer, autoincrement=True, primary_key=True )
  763.     sku_internal_identifier = Column( String(32), nullable=False, primary_key=True )
  764.     name = Column( String(128), nullable=False )
  765.     description = Column( String(256), nullable=False )
  766.     category = Column( String(32) )
  767.  
  768.     purchaseable = Column( Boolean, nullable=False, default=False )
  769.  
  770.     soft_currency_cost = Column( Integer )
  771.     hard_currency_cost = Column( Integer )
  772.  
  773.     steam_sellable = Column( Boolean, default=False )
  774.  
  775.     def __init__(self, sku_internal_identifier, name, description, purchaseable = False):
  776.         self.sku_internal_identifier = sku_internal_identifier
  777.         self.name = name
  778.         self.description = description
  779.         self.purchaseable = purchaseable
  780.  
  781.  
  782. class ShopSKUPrice(db.Model):
  783.     """
  784. CREATE SEQUENCE shop_sku_prices_id_seq;
  785.  
  786. CREATE TABLE shop_sku_prices(
  787.     id integer not null unique default nextval('shop_sku_prices_id_seq'::regclass),
  788.  
  789.     sku_id integer not null,
  790.     currency varchar(5) not null,
  791.     unit_price integer,
  792.  
  793.     primary key (id, sku_id),
  794.     foreign key (sku_id) references shop_item_skus(id) on delete cascade
  795. );
  796.     """
  797.  
  798.     __tablename__ = "shop_sku_prices"
  799.     id = Column( Integer, autoincrement=True, primary_key=True )
  800.     sku_id = Column( Integer, ForeignKey("shop_item_skus.id"), nullable=False, primary_key=True )
  801.     currency = Column( String(5), nullable=False )
  802.     unit_price = Column( Integer, nullable=False )
  803.  
  804.     def __init__(self, sku_id, currency, unit_price):
  805.         self.sku_id = sku_id
  806.         self.currency = currency
  807.         self.unit_price = unit_price
  808.  
  809.  
  810. class ShopTransaction(db.Model):
  811.     """
  812. CREATE SEQUENCE shoptransactions_id_seq START WITH 100000;
  813.  
  814. CREATE TABLE shoptransactions(
  815.     id integer not null unique default nextval('shoptransactions_id_seq'::regclass),
  816.     user_id integer not null,
  817.  
  818.     merchant_txn_id varchar(64), /* the remote merchant's transaction id */
  819.  
  820.     purchase_method varchar(16) not null,  /* "ingame", "steam", "apple", "google", but currently always "steam" */
  821.     tx_state varchar(32) not null, /* "open", "wait_payment", "confirmed", "failed", "rejected" */
  822.     items_delivered boolean not null,
  823.  
  824.     total_price integer not null, /* in 1/100th of the currency unit */
  825.     currency varchar(5) not null,
  826.  
  827.     start_timestamp timestamp with time zone,
  828.     confirm_timestamp timestamp with time zone,
  829.     delivered_timestamp timestamp with time zone,
  830.  
  831.     primary key (id, user_id),
  832.     foreign key ( user_id ) references users(id) on delete restrict
  833. );
  834.     """
  835.     __tablename__ = "shoptransactions"
  836.     id = Column( Integer, autoincrement=True, primary_key=True )
  837.     user_id = Column( Integer, ForeignKey( "users.id" ), nullable=False, primary_key=True )
  838.     merchant_txn_id = Column( String(64) )
  839.  
  840.     purchase_method = Column( String(16), nullable=False )
  841.     tx_state = Column( String(32), nullable=False )
  842.     items_delivered = Column( Boolean, nullable=False, default=False )
  843.  
  844.     total_price = Column( Integer, nullable=False )
  845.     currency = Column( String(5), nullable=False )
  846.  
  847.     start_timestamp = Column( TIMESTAMP(timezone=True) )
  848.     confirm_timestamp = Column( TIMESTAMP(timezone=True) )
  849.     delivered_timestamp = Column( TIMESTAMP(timezone=True) )
  850.  
  851.     def __init__(self, user_id, purchase_method, price, currency ):
  852.         self.user_id = user_id
  853.         self.purchase_method = purchase_method
  854.         self.total_price = price
  855.         self.currency = currency
  856.  
  857.         self.tx_state = "open"
  858.         self.items_delivered = False
  859.  
  860.         self.start_timestamp = datetime.datetime.now()
  861.  
  862.  
  863. class ShopTransactionItem(db.Model):
  864.     """
  865. CREATE SEQUENCE shoptransaction_items_id_seq;
  866.  
  867. CREATE TABLE shoptransaction_items(
  868.     id integer not null unique default nextval('shoptransaction_items_id_seq'::regclass),
  869.     tx_id integer not null,
  870.  
  871.     item_sku_id integer not null,
  872.     quantity integer not null,
  873.     unit_price integer not null,
  874.     total_price integer not null,
  875.  
  876.     currency varchar(5) not null,
  877.  
  878.     primary key (id, tx_id),
  879.     foreign key (tx_id) references shoptransactions(id) on delete cascade,
  880.     foreign key (item_sku_id) references shop_item_skus(id) on delete restrict
  881. );
  882.     """
  883.  
  884.     __tablename__ = "shoptransaction_items"
  885.  
  886.     id = Column( Integer, autoincrement=True, primary_key=True )
  887.     tx_id = Column( Integer, ForeignKey( "shoptransactions.id"), nullable=False, primary_key=True )
  888.  
  889.     item_sku_id = Column( Integer, ForeignKey( "shop_item_skus.id" ), nullable=False )
  890.     quantity = Column( Integer, nullable=False )
  891.     unit_price = Column( Integer, nullable=False )
  892.     total_price = Column( Integer, nullable=False )
  893.  
  894.     currency = Column( String(5), nullable=False )
  895.  
  896.     def __init__(self, tx_id, item_id, quantity, currency, unit_price):
  897.         self.tx_id = tx_id
  898.         self.item_sku_id = item_id
  899.         self.quantity = quantity
  900.         self.currency = currency
  901.         self.unit_price = unit_price
  902.         self.total_price = quantity * unit_price
  903. db.create_all()
  904. db.session.commit()
  905.  
  906.  

After running this code getting following error:
Expand|Select|Wrap|Line Numbers
  1. /usr/local/lib/python3.6/dist-packages/flask_sqlalchemy/__init__.py:873: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  2.   'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '
  3. Traceback (most recent call last):
  4.   File "create_postgresql_database.py", line 903, in <module>
  5.     db.create_all()
  6.   File "/usr/local/lib/python3.6/dist-packages/flask_sqlalchemy/__init__.py", line 1094, in create_all
  7.     self._execute_for_all_tables(app, bind, 'create_all')
  8.   File "/usr/local/lib/python3.6/dist-packages/flask_sqlalchemy/__init__.py", line 1086, in _execute_for_all_tables
  9.     op(bind=self.get_engine(app, bind), **extra)
  10.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/schema.py", line 4740, in create_all
  11.     ddl.SchemaGenerator, self, checkfirst=checkfirst, tables=tables
  12.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/engine/base.py", line 3078, in _run_ddl_visitor
  13.     conn._run_ddl_visitor(visitorcallable, element, **kwargs)
  14.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/engine/base.py", line 2081, in _run_ddl_visitor
  15.     visitorcallable(self.dialect, self, **kwargs).traverse_single(element)
  16.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/visitors.py", line 485, in traverse_single
  17.     return meth(obj, **kw)
  18.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/ddl.py", line 850, in visit_metadata
  19.     _is_metadata_operation=True,
  20.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/visitors.py", line 485, in traverse_single
  21.     return meth(obj, **kw)
  22.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/ddl.py", line 895, in visit_table
  23.     include_foreign_key_constraints,  # noqa
  24.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/engine/base.py", line 1262, in execute
  25.     return meth(self, multiparams, params, _EMPTY_EXECUTION_OPTS)
  26.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/ddl.py", line 78, in _execute_on_connection
  27.     self, multiparams, params, execution_options
  28.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/engine/base.py", line 1350, in _execute_ddl
  29.     dialect=dialect, schema_translate_map=schema_translate_map
  30.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/elements.py", line 517, in compile
  31.     return self._compiler(dialect, **kw)
  32.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/ddl.py", line 29, in _compiler
  33.     return dialect.ddl_compiler(dialect, self, **kw)
  34.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/compiler.py", line 455, in __init__
  35.     self.string = self.process(self.statement, **compile_kwargs)
  36.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/compiler.py", line 490, in process
  37.     return obj._compiler_dispatch(self, **kwargs)
  38.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/visitors.py", line 81, in _compiler_dispatch
  39.     return meth(self, **kw)
  40.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/compiler.py", line 4032, in visit_create_table
  41.     create_column, first_pk=column.primary_key and not first_pk
  42.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/compiler.py", line 490, in process
  43.     return obj._compiler_dispatch(self, **kwargs)
  44.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/visitors.py", line 81, in _compiler_dispatch
  45.     return meth(self, **kw)
  46.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/compiler.py", line 4065, in visit_create_column
  47.     text = self.get_column_specification(column, first_pk=first_pk)
  48.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/dialects/postgresql/base.py", line 2474, in get_column_specification
  49.     and column is column.table._autoincrement_column
  50.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/schema.py", line 810, in _autoincrement_column
  51.     return self.primary_key._autoincrement_column
  52.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/util/langhelpers.py", line 1113, in __get__
  53.     obj.__dict__[self.__name__] = result = self.fget(obj)
  54.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/schema.py", line 3954, in _autoincrement_column
  55.     _validate_autoinc(col, True)
  56.   File "/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/schema.py", line 3928, in _validate_autoinc
  57.     "compatible with autoincrement=True" % (col.type, col)
  58. sqlalchemy.exc.ArgumentError: Column type VARCHAR(64) on column 'sessions.session_id' is not compatible with autoincrement=True
  59.  
Anyone can help me what is wrong?
Is it connection problem as I have checked properly.
Also is it due to new postgresql version.
Jun 14 '21 #1
2 2142
zille
2 2Bits
After removing all ", autoincrement=True "
i get error:
There is no unique constraint matching given key for referenced table"shop_item_skus"
CREATE TABLE shop_sku_prices(
id integer not null unique default nextval('shop_sku_prices_id_seq'::regclass),

sku_id integer not null,
currency varchar(5) not null,
unit_price integer,

primary key (id, sku_id),
foreign key (sku_id) references shop_item_skus(id) on delete cascade
);
Jun 14 '21 #2
Banfa
9,058 Expert Mod 8TB
You probably didn't want to remove all the autoincrements, you should have examined the traceback in more detail; last line of the traceback indicates an autoincrement on a VARCHAR(64) (or string(64)) column is invalid. The only place you have a string(64) column with an autoincrement is line 39.

I would alter just that line and see what errors you get.
Jun 15 '21 #3

Post your reply

Sign in to post your reply or Sign up for a free account.

Similar topics

1 post views Thread by miguelk | last post: by
2 posts views Thread by pepericou | last post: by
6 posts views Thread by andrew blah | last post: by
4 posts views Thread by Ish Ahluwalia | last post: by
reply views Thread by David Michael Schruth, | last post: by
reply views Thread by zhoujie | last post: by
2 posts views Thread by Marin | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.