У меня есть четыре таблицы - пользователи, Канада, Франция, Германия - которые полностью независимы.Я (я считаю) добавил их в базу данных.Но столбцы всех баз данных, кроме пользователей, кажутся неспособными выполнять запросы, несмотря на то, что они там.(Можно запросить их, но не использовать fliter () или all () или first () или выполнить итерацию по результатам запроса.) Мне интересно, заключается ли проблема в том, что мне нужно использовать эту вещь Declarative_base?
DATABASE_URL = os.environ["DATABASE_URL"]
app = Flask(__name__)
app.secret_key = "real key will go here"
app.config.update(mail_settings)
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config['SQLALCHEMY_DATABASE_URI'] = DATABASE_URL
db = SQLAlchemy(app)
class Users(db.Model):
__tablename__ = "Users"
id_ = db.Column(db.Integer, primary_key=True)
name_ = db.Column(db.String(100))
email_ = db.Column(db.String(100))
date_ = db.Column(db.Date())
count_ = db.Column(db.Integer)
def __init__(self, email, name, date=datetime.datetime.now().date(), count=0):
self.name_ = name
self.email_ = email
self.date_ = date
self.count_ = count
def __repr__(self):
return '<User %r>' % self.email_
class Canada(db.Model):
__tablename__ = 'Canada'
id_ = db.Column(db.Integer, primary_key=True)
address = db.Column(db.String(100))
def __init__(self, address):
self.address = address
def __repr__(self):
return "<Canadian address %r>" % self.address
class France(db.Model):
__tablename__ = "France"
id_ = db.Column(db.Integer, primary_key=True)
address = db.Column(db.String(100))
def __init__(self, address):
self.address = address
def __repr__(self):
return "<French address %r>" % self.address
class Germany(db.Model):
__tablename__ = "Germany"
id_ = db.Column(db.Integer, primary_key=True)
address = db.Column(db.String(100))
def __init__(self, address):
self.address = address
def __repr__(self):
return "<German address %r>" % self.address
db.create_all()
db.session.commit()
Я могу добавлять пользователей и затем запрашивать их с помощью веб-формы без каких-либо проблем.
Но когда я пытаюсь добавить канадские базы данных (я проверяю, есть ли они уже в перед добавлением), мойСбой запроса:
db.session.query(Canada).filter(Canada.address == address).first()
Вот вывод:
2018-09-11T13:49:14.998235+00:00 app[web.1]: Traceback (most recent call last):
2018-09-11T13:49:14.998237+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 2292, in wsgi_app
2018-09-11T13:49:14.998239+00:00 app[web.1]: response = self.full_dispatch_request()
2018-09-11T13:49:14.998241+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
2018-09-11T13:49:14.998242+00:00 app[web.1]: rv = self.handle_user_exception(e)
2018-09-11T13:49:14.998244+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1718, in handle_user_exception
2018-09-11T13:49:14.998246+00:00 app[web.1]: reraise(exc_type, exc_value, tb)
2018-09-11T13:49:14.998247+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
2018-09-11T13:49:14.998249+00:00 app[web.1]: rv = self.dispatch_request()
2018-09-11T13:49:14.998251+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1799, in dispatch_request
2018-09-11T13:49:14.998253+00:00 app[web.1]: return self.view_functions[rule.endpoint](**req.view_args)
2018-09-11T13:49:14.998255+00:00 app[web.1]: File "/app/app.py", line 111, in admin
2018-09-11T13:49:14.998256+00:00 app[web.1]: if db.session.query(Canada).filter(Canada.address == address).first() is None:
2018-09-11T13:49:14.998258+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2888, in first
2018-09-11T13:49:14.998260+00:00 app[web.1]: ret = list(self[0:1])
2018-09-11T13:49:14.998262+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2680, in __getitem__
2018-09-11T13:49:14.998263+00:00 app[web.1]: return list(res)
2018-09-11T13:49:14.998265+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2988, in __iter__
2018-09-11T13:49:14.998267+00:00 app[web.1]: return self._execute_and_instances(context)
2018-09-11T13:49:14.998269+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 3011, in _execute_and_instances
2018-09-11T13:49:14.998270+00:00 app[web.1]: result = conn.execute(querycontext.statement, self._params)
2018-09-11T13:49:14.998272+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 948, in execute
2018-09-11T13:49:14.998274+00:00 app[web.1]: return meth(self, multiparams, params)
2018-09-11T13:49:14.998276+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 269, in _execute_on_connection
2018-09-11T13:49:14.998278+00:00 app[web.1]: return connection._execute_clauseelement(self, multiparams, params)
2018-09-11T13:49:14.998279+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1060, in _execute_clauseelement
2018-09-11T13:49:14.998281+00:00 app[web.1]: compiled_sql, distilled_params
2018-09-11T13:49:14.998282+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1200, in _execute_context
2018-09-11T13:49:14.998284+00:00 app[web.1]: context)
2018-09-11T13:49:14.998297+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1413, in _handle_dbapi_exception
2018-09-11T13:49:14.998299+00:00 app[web.1]: exc_info
2018-09-11T13:49:14.998300+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 265, in raise_from_cause
2018-09-11T13:49:14.998302+00:00 app[web.1]: reraise(type(exception), exception, tb=exc_tb, cause=cause)
2018-09-11T13:49:14.998304+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context
2018-09-11T13:49:14.998305+00:00 app[web.1]: context)
2018-09-11T13:49:14.998308+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 509, in do_execute
2018-09-11T13:49:14.998310+00:00 app[web.1]: cursor.execute(statement, parameters)
2018-09-11T13:49:14.998311+00:00 app[web.1]: ProgrammingError: (psycopg2.ProgrammingError) column Canada.address does not exist
2018-09-11T13:49:14.998313+00:00 app[web.1]: LINE 1: SELECT "Canada".id_ AS "Canada_id_", "Canada".address AS "Ca...
2018-09-11T13:49:14.998315+00:00 app[web.1]: ^
2018-09-11T13:49:14.998318+00:00 app[web.1]: [SQL: 'SELECT "Canada".id_ AS "Canada_id_", "Canada".address AS "Canada_address" \nFROM "Canada" \nWHERE "Canada".address = %(address_1)s \n LIMIT %(param_1)s'] [parameters: {'address_1': u'123 fake st. canada\r', 'param_1': 1}] (Background on this error at: http://sqlalche.me/e/f405)
Я пробовал десятки вещей - перемещение кода в разные файлы, добавление некоторого кода с использованием «движка», изменениеназвания колонок в Канаде, смена названия Канады - но, похоже, ничего не решило проблему.Одна вещь, которую я заметил, состоит в том, что все учебники, которые я изучал, используют только одну таблицу в своей базе данных.Мне интересно, если это в основе проблемы.Мне не удалось найти руководство по использованию нескольких независимых таблиц.
Кажется, что столбцы есть.
>>> for column in Users.__table__.columns:
... print column
...
Users.id_
Users.name_
Users.email_
Users.date_
Users.count_
>>> mapper = inspect(Users)
>>> for column in mapper.attrs:
... print column
...
Users.id_
Users.name_
Users.email_
Users.date_
Users.count_
>>>
>>> from sqlalchemy import inspect
>>> mapper = inspect(Canada)
>>> for column in mapper.attrs:
... print column
...
Canada.id_
Canada.address
>>> for column in Canada.__table__.columns:
... print column
...
Canada.id_
Canada.address
Я не знаю, почему мой скрипт может запрашивать столбцыПользователи, но не столбцы Канады.
Так почему SQLAlchemy генерирует запрос, в котором столбец не может быть найден?
2018-09-11T13:49:14.998311+00:00 app[web.1]: ProgrammingError: (psycopg2.ProgrammingError) column Canada.address does not exist
2018-09-11T13:49:14.998313+00:00 app[web.1]: LINE 1: SELECT "Canada".id_ AS "Canada_id_", "Canada".address AS "Ca...
2018-09-11T13:49:14.998315+00:00 app[web.1]: ^
2018-09-11T13:49:14.998318+00:00 app[web.1]: [SQL: 'SELECT "Canada".id_ AS "Canada_id_", "Canada".address AS "Canada_address" \nFROM "Canada" \nWHERE "Canada".address = %(address_1)s \n LIMIT %(param_1)s'] [parameters: {'address_1': u'123 fake st. canada\r', 'param_1': 1}] (Background on this error at: http://sqlalche.me/e/f405)
Когда я выполняю heroku run python
, я вижу следующее:
`>>> from app import db, Users, Canada
>>> db.session.query(Users).all()
[<User u'mhd@example.com'>, <User u'md@example.edu'>]
>>> db.session.query(Canada).all()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2836, in all
return list(self)
File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2988, in __iter__
return self._execute_and_instances(context)
File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 3011, in _execute_and_instances
result = conn.execute(querycontext.statement, self._params)
File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 948, in execute
return meth(self, multiparams, params)
File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 269, in _execute_on_connection
return connection._execute_clauseelement(self, multiparams, params)
File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1060, in _execute_clauseelement
compiled_sql, distilled_params
File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1200, in _execute_context
context)
File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1413, in _handle_dbapi_exception
exc_info
File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 265, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb, cause=cause)
File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context
context)
File "/app/.heroku/python/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 509, in do_execute
cursor.execute(statement, parameters)
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) column Canada.address does not exist
LINE 1: SELECT "Canada".id_ AS "Canada_id_", "Canada".address AS "Ca...
^
[SQL: 'SELECT "Canada".id_ AS "Canada_id_", "Canada".address AS "Canada_address" \nFROM "Canada"'] (Background on this error at: http://sqlalche.me/e/f405)
Между пользователями и Канадой что-то категорически отличается.