некоторые начинающие путают с flask -sqlalchemy - PullRequest
0 голосов
/ 11 марта 2020

sqlalchemy, и я пытаюсь понять, как лучше работают объекты. У меня есть тестовый код, который, кажется, работает не так, как учебные пособия, и я запутался. Я думаю, что это случай, когда путаница с документами tensflow 1 против 2 происходит

код, который я разместил, мне говорят, что он работает для других людей, и последняя строка этого - database.session.commit (), код является последним блоком кода.

Это новая стабильная виртуальная машина Debian, на которой установлены только VSCode, терминатор и b python, помимо того, что необходимо для приложения. ЭТО ДОЛЖНО РАБОТАТЬ.

файл базы данных создан, но не заполнен. таблицы создаются, но не столбцы или строки.

Оболочка sqlite3 показывает, что в базе данных ничего нет, но есть таблицы

database.session.flush() 

тоже не добавляет вещи

database.session.query(User).all() 

также возвращает пустую вещьamaamab

и

database.session.query(User).filter(User.user_id)

возвращает: SQLAlchemy object has no attribute "query"

Я пытаюсь создать функцию, которая возвращает объект пользователя на основе на его user_id, а затем изменить переменную в этом пользовательском объекте, используя

 object.field = "blorp"

. Я могу создать объект и получить к нему доступ, как

user = User() 
user.user_id

, но по какой-то странной причине, даже если у меня есть установлены значения по умолчанию, эти поля не заполнены этими значениями по умолчанию. Я должен явно определить поля во время объявления

, но я могу назначить такие вещи, как:

user.user_id = 2

этот объект возвращает ВСЕХ пользователей, верно?

>>> asdf = database.session.query(User)
>>> asdf
<flask_sqlalchemy.BaseQuery object at 0x7f49aacff780>

метод "all ()" возвращает пустой массив для class.query и database.session.query

>>> users = User.query.all()
>>> users
[]
>>> users = database.session.query(User).all()
>>> users
[]

, используя следующий тестовый код:

from flask.config import Config
from flask import Flask, render_template, Response, Request ,Config
from flask_sqlalchemy import SQLAlchemy

HTTP_HOST  = "gamebiscuits"
ADMIN_NAME = "Emperor of Sol"
ADMIN_PASSWORD = "password"
ADMIN_EMAIL = "game_admin"
DANGER_STRING= "TACOCAT"

class Config(object):
    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + HTTP_HOST + '.db'
    SQLALCHEMY_TRACK_MODIFICATIONS = True

solar_empire_server = Flask(__name__ , template_folder="templates" )
solar_empire_server.config.from_object(Config)
database    = SQLAlchemy(solar_empire_server)

def update_database(thing):
    database.session.add(thing)
    database.commit()


def user_by_id(id_of_user):
    return User.query.filter_by(user_id = id_of_user).first()

#without the flask migrate module, you need to instantiate
# databases with default values. That module wont be loaded 
# yet during the creation of a NEW game
class User(database.Model):
    user_id       = database.Column(database.Integer,     default = 0, primary_key = True)
    username      = database.Column(database.String(64),  default = "tourist", index=True, unique=True)
    email         = database.Column(database.String(120), default = DANGER_STRING , index=True, unique=True)
    password_hash = database.Column(database.String(128), default = DANGER_STRING)
    turns_run     = database.Column(database.Integer,     default = 0)
    cash          = database.Column(database.Integer,     default = 1000)
    def __repr__(self):
        return '<User id:{} name: {} >'.format(self.user_id , self.username)

class UserShip(User):
    ship_id      = database.Column(database.String(128),  default = "1")
    ship_name    = database.Column(database.String(128),  default = "goodship moop")
    def __repr__(self):
        return '<User id:{} name: {} >'.format(self.ship_id , self.ship_name)

admin = User(username=ADMIN_NAME, user_id = 1, email=ADMIN_EMAIL , password_hash = ADMIN_PASSWORD)
guest = User(username='guest',    user_id = 2, email='test@game.net' , password_hash = 'password')
user = User()
usership = UserShip()
adminship = UserShip()
guestship = UserShip()

database.create_all()
database.session.add(admin)
database.session.add(guest)
database.session.add(user)
database.session.add(usership)
database.session.add(adminship)
database.session.add(guestship)
database.session.commit()

1 Ответ

0 голосов
/ 12 марта 2020

Хорошо, поэтому, когда вы увидите default, здесь будет INSERT (см. Документацию по умолчанию SQLAlchemy ). Чтобы процитировать ключевую часть здесь:

Столбцы по умолчанию INSERT и UPDATE относятся к функциям, которые создают значение по умолчанию для определенного столбца в строке, поскольку оператор INSERT или UPDATE выполняется для этой строки в случай, когда для оператора INSERT или UPDATE не было предоставлено значение для этого столбца.

Таким образом, эти значения по умолчанию будут инициализированы только при добавлении в базу данных, очистка не будет иметь никакого эффекта, если объект, который имеет не было добавлено (session.add). Так что User() только собирается создать объект , он не будет создавать строку БД, пока вы не добавите (и не выполните flu sh / commit), если необходимо).

...