Flask SQLAlchemy не будет создавать запись (DateTimeField) - PullRequest
1 голос
/ 21 февраля 2020

Я собираю CRM, и у меня небольшие проблемы. Все работало просто отлично, пока я не попытался провести время с DateTimeField с SQLAlchemy. Перед добавлением поля времени запись будет создаваться и добавляться в базу данных без каких-либо проблем. Однако после этого я просто не смогу создать запись. Страница перезагрузится, и у меня не будет ошибок проверки. Я подключился к этому, и наконец получил ошибку. Все данные проходят нормально, кроме времени. Время подается как <wtforms.fields.core.DateTimeField object at 0x10fe67210>. Как мне обойти эту проблему? Я чувствую, что решение простое, и я буду чувствовать себя глупым, если не увижу его раньше. Ваша помощь очень ценится!

Вот весь журнал ошибок:

sqlalchemy.exc.StatementError
sqlalchemy.exc.StatementError: (builtins.TypeError) SQLite DateTime type only accepts Python datetime and date objects as input.
[SQL: INSERT INTO tours (customer_fname, customer_lname, customer_phone, partner_fname, partner_lname, partner_phone, region, tour_date, tour_time, gift, timestamp, user_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]
[parameters: [{'user_id': 1, 'partner_phone': 'jkljlkj', 'tour_time': <wtforms.fields.core.DateTimeField object at 0x10fe67210>, 'partner_lname': 'jkljlk', 'region ... (34 characters truncated) ... ': 'kljklj', 'gift': 'Cruise', 'customer_lname': 'lkjlk', 'customer_phone': 'jkljl', 'partner_fname': 'jlkjlk', 'timestamp': None, 'tour_date': None}]]

Traceback (most recent call last)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1173, in _execute_context
context = constructor(dialect, self, conn, *args)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 808, in _init_compiled
param.append(processors[key](compiled_params[key]))
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/dialects/sqlite/base.py", line 759, in process
"SQLite DateTime type only accepts Python "
The above exception was the direct cause of the following exception:
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/app.py", line 2463, in __call__
return self.wsgi_app(environ, start_response)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/app.py", line 2449, in wsgi_app
response = self.handle_exception(e)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/app.py", line 1866, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/flask_login/utils.py", line 272, in decorated_view
return func(*args, **kwargs)
File "/Users/brandoncarr/Desktop/BlueSkyAdmin/app/routes.py", line 68, in new_tour
db.session.commit()
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/orm/scoping.py", line 162, in do
return getattr(self.registry(), name)(*args, **kwargs)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 1036, in commit
self.transaction.commit()
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 503, in commit
self._prepare_impl()
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 482, in _prepare_impl
self.session.flush()
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2479, in flush
self._flush(objects)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2617, in _flush
transaction.rollback(_capture_exception=True)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__
compat.reraise(exc_type, exc_value, exc_tb)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 153, in reraise
raise value
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2577, in _flush
flush_context.execute()
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/orm/unitofwork.py", line 422, in execute
rec.execute(self)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/orm/unitofwork.py", line 589, in execute
uow,
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/orm/persistence.py", line 245, in save_obj
insert,
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/orm/persistence.py", line 1137, in _emit_insert_statements
statement, params
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 982, in execute
return meth(self, multiparams, params)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/sql/elements.py", line 293, in _execute_on_connection
return connection._execute_clauseelement(self, multiparams, params)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1101, in _execute_clauseelement
distilled_params,
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1176, in _execute_context
e, util.text_type(statement), parameters, None, None
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1476, in _handle_dbapi_exception
util.raise_from_cause(sqlalchemy_exception, exc_info)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 398, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb, cause=cause)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 152, in reraise
raise value.with_traceback(tb)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1173, in _execute_context
context = constructor(dialect, self, conn, *args)
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 808, in _init_compiled
param.append(processors[key](compiled_params[key]))
File "/Users/brandoncarr/.local/share/virtualenvs/BlueSkyAdmin-PG_RBAa1/lib/python3.7/site-packages/sqlalchemy/dialects/sqlite/base.py", line 759, in process
"SQLite DateTime type only accepts Python "

Мой взгляд:

@app.route('/tours/new', methods=['GET', 'POST'])
@login_required
def new_tour():
    form = ToursForm()
    if form.validate_on_submit():
        tours = Tours(customer_fname=form.customer_fname.data, customer_lname=form.customer_lname.data, 
        partner_fname=form.partner_fname.data, partner_lname=form.partner_lname.data, 
        customer_phone=form.customer_phone.data, partner_phone=form.partner_phone.data, 
        region=form.region.data, gift=form.gift.data, tour_time=form.tour_time, author=current_user)
        db.session.add(tours)
        db.session.commit()
        flash('Tour has been created', 'success')
        return redirect(url_for('tours'))
    return render_template('create-tour.html', title='Create A New Tour', form=form)

Моя модель:

class Tours(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    customer_fname = db.Column(db.String(50))
    customer_lname = db.Column(db.String(50))
    customer_phone = db.Column(db.String(140))
    partner_fname = db.Column(db.String(100))
    partner_lname = db.Column(db.String(100))
    partner_phone = db.Column(db.String(100))
    region = db.Column(db.String(140))
    tour_date = db.Column(db.DateTime())
    tour_time = db.Column(db.DateTime, default=datetime.utcnow)
    gift = db.Column(db.String())
    timestamp = db.Column(db.DateTime())
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    def __repr__(self):
        return '<Tours {}>'.format(self.customer_fname, self.customer_lname, self.customer_phone, 
        self.partner_fname, self.partner_lname, self.partner_phone, self.region, self.tour_date, 
        self.tour_time, self.gift, self.timestamp)

Моя форма:

class ToursForm(FlaskForm):
    customer_fname = StringField('Customer First Name', validators=[DataRequired()])
    customer_lname = StringField('Customer Last Name', validators=[DataRequired()])
    customer_phone = StringField('Phone Number', validators=[DataRequired()])
    partner_fname = StringField('Partner First Name', validators=[DataRequired()])
    partner_lname = StringField('Partner Last Name', validators=[DataRequired()])
    partner_phone = StringField('Phone Number', validators=[DataRequired()])
    # tour_date = DateTimeField('Tour Date')
    tour_time = DateTimeField('Tour Time', format='%I:%M %p')
    gift = SelectField('Gift Selected', choices=[('Cruise', 'Cruise'), ('Hotel Suite', 'Hotel Suite'), ('Airfare', 'Airfare'), ('Safari', 'Safari')])
    region = SelectField('Region', choices=[('Select Region', 'Select Region'), ('Oceanside', 'Oceanside'), ('Scottsdale', 'Scottsdale'), ('Granite Bay', 'Granite Bay'), ('Laguna Hills', 'Laguna Hills')])
    submit = SubmitField('Add Tour')

1 Ответ

3 голосов
/ 21 февраля 2020

Как и во всех других полях, доступ к данным поля tour_time. Теперь вы передаете само поле как значение.

tour_time=form.tour_time

должно быть

tour_time=form.tour_time.data
...