· 8 years ago · Jan 18, 2018, 04:06 PM
1import os
2
3from flask import Flask
4from flask_sqlalchemy import SQLAlchemy
5from flask_migrate import Migrate
6
7
8basedir = os.path.abspath(os.path.dirname(__file__))
9
10
11class Config:
12 SECRET_KEY = os.environ.get('SECRET_KEY') or 'a-key'
13 SQLALCHEMY_DATABASE_URI = (
14 os.environ.get('DATABASE_URI')
15 or 'sqlite:///' + os.path.join(basedir, 'app.db'))
16 SQLALCHEMY_TRACK_MODIFICATIONS = False
17
18
19app = Flask(__name__)
20app.config.from_object(Config)
21
22db = SQLAlchemy(app)
23migrate = Migrate(app, db)
24
25
26class User(db.Model):
27
28 id = db.Column(db.Integer, primary_key=True)
29
30 name = db.Column(db.String(64), index=True, unique=True)
31
32 # Games created by the user:
33 created_games = db.relationship(
34 'Game', backref='author', lazy='dynamic',
35 foreign_keys='game.user_id')
36
37 # Games as opponent:
38 invitations = db.relationship(
39 'Game', backref='guest', lazy='dynamic',
40 foreign_keys='game.opponent_id')
41
42
43class Game(db.Model):
44
45 id = db.Column(db.Integer, primary_key=True)
46
47 # "Creator" user:
48 user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
49
50 # "Opponent" user:
51 opponent_id = db.Column(db.Integer, db.ForeignKey('user.id'))
52
53(venv) $ export FLASK_APP=app.py
54(venv) $ flask db init
55...
56(venv) $ flask db migrate
57...
58(venv) $ flask db upgrade
59...
60
61(venv) $ python
62Python 3.6.0
63...
64>>> from app import User
65>>> u = User(name="Alice")
66Traceback (most recent call last):
67 File "<stdin>", line 1, in <module>
68 File "<string>", line 2, in __init__
69 File "/home/ubuntu/workspace/Exp/venv/lib/python3.6/site-packages/sqlalchemy/orm/instrumentation.py", line 347, in _new_state_if_none
70 state = self._state_constructor(instance, self)
71 File "/home/ubuntu/workspace/Exp/venv/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 767, in __get__
72 obj.__dict__[self.__name__] = result = self.fget(obj)
73 File "/home/ubuntu/workspace/Exp/venv/lib/python3.6/site-packages/sqlalchemy/orm/instrumentation.py", line 177, in _state_constructor
74 self.dispatch.first_init(self, self.class_)
75 File "/home/ubuntu/workspace/Exp/venv/lib/python3.6/site-packages/sqlalchemy/event/attr.py", line 256, in __call__
76 fn(*args, **kw)
77 File "/home/ubuntu/workspace/Exp/venv/lib/python3.6/site-packages/sqlalchemy/orm/mapper.py", line 3123, in _event_on_first_init
78 configure_mappers()
79 File "/home/ubuntu/workspace/Exp/venv/lib/python3.6/site-packages/sqlalchemy/orm/mapper.py", line 3013, in configure_mappers
80 mapper._post_configure_properties()
81 File "/home/ubuntu/workspace/Exp/venv/lib/python3.6/site-packages/sqlalchemy/orm/mapper.py", line 1811, in _post_configure_properties
82 prop.init()
83 File "/home/ubuntu/workspace/Exp/venv/lib/python3.6/site-packages/sqlalchemy/orm/interfaces.py", line 184, in init
84 self.do_init()
85 File "/home/ubuntu/workspace/Exp/venv/lib/python3.6/site-packages/sqlalchemy/orm/relationships.py", line 1655, in do_init
86 self._process_dependent_arguments()
87 File "/home/ubuntu/workspace/Exp/venv/lib/python3.6/site-packages/sqlalchemy/orm/relationships.py", line 1680, in _process_dependent_arguments
88 setattr(self, attr, attr_value())
89 File "/home/ubuntu/workspace/Exp/venv/lib/python3.6/site-packages/sqlalchemy/ext/declarative/clsregistry.py", line 281, in __call__
90 x = eval(self.arg, globals(), self._dict)
91 File "<string>", line 1, in <module>
92AttributeError: 'Table' object has no attribute 'user_id'