Size: a a a

2020 June 24

tn

tot samiy neizvestni... in Python Flask
Aryn
Есть функция, как мне через неё добавить юзера в бд? Сама функция находится в классе User

  def register(self):
   result = True
   for user in User.query.all():
     if user.username == self.username:
       result = False
       break
     if user.email == self.email:
       result = False
       break
   if result != False:
     #new_user = User(name = self.name, username = self.username, email = self.email, password = self.password)
     db.session.add(name = self.name, username = self.username, email = self.email, password = self.password)
     db.session.commit()
   return result
Кошмар... Посмотри фильтры для начала
источник

АП

Агент Печенька... in Python Flask
Aryn
Я просто подругому не понимаю как сделать конструкцию регистрации
Написать схему бд в которой уникальные поля почты и юзернема. Опционально написать запрос который ищет заданую почту и юзернейм в базе (вместо этого цикла по всем пользователям). Создать нового пользователя, поймать ошибку если пользователь с такими параметрами уже есть.
источник

tn

tot samiy neizvestni... in Python Flask
tot samiy neizvestniy
Кошмар... Посмотри фильтры для начала
А потом, как создать экземпляр объекта
источник

A

Aryn in Python Flask
Ну, начало объекта примерно такое:
class User(db.Model, UserMixin):
 __tablename__ = 'users'
 id = db.Column(db.Integer, primary_key=True)
 name = db.Column(db.String(100), nullable=False)
 username = db.Column(db.String(40), nullable=False, unique=True)
 email = db.Column(db.String(200), nullable=False, unique=True)
 password = db.Column(db.String(256), nullable=False)
 avatar = db.Column(db.LargeBinary, default=open("static/icons/default.png", "rb"))
 time = db.Column(db.DateTime, default=datetime.utcnow)

 def __repr__(self):
   return f"<User {self.id}:{self.username}>"
источник

tn

tot samiy neizvestni... in Python Flask
Aryn
Ну, начало объекта примерно такое:
class User(db.Model, UserMixin):
 __tablename__ = 'users'
 id = db.Column(db.Integer, primary_key=True)
 name = db.Column(db.String(100), nullable=False)
 username = db.Column(db.String(40), nullable=False, unique=True)
 email = db.Column(db.String(200), nullable=False, unique=True)
 password = db.Column(db.String(256), nullable=False)
 avatar = db.Column(db.LargeBinary, default=open("static/icons/default.png", "rb"))
 time = db.Column(db.DateTime, default=datetime.utcnow)

 def __repr__(self):
   return f"<User {self.id}:{self.username}>"
Читай правила, друг
источник

A

Aryn in Python Flask
tot samiy neizvestniy
Читай правила, друг
Дак тут 13 строк
источник

tn

tot samiy neizvestni... in Python Flask
Aryn
Ну, начало объекта примерно такое:
class User(db.Model, UserMixin):
 __tablename__ = 'users'
 id = db.Column(db.Integer, primary_key=True)
 name = db.Column(db.String(100), nullable=False)
 username = db.Column(db.String(40), nullable=False, unique=True)
 email = db.Column(db.String(200), nullable=False, unique=True)
 password = db.Column(db.String(256), nullable=False)
 avatar = db.Column(db.LargeBinary, default=open("static/icons/default.png", "rb"))
 time = db.Column(db.DateTime, default=datetime.utcnow)

 def __repr__(self):
   return f"<User {self.id}:{self.username}>"
Используй фильтр для поиска юзеров в бд по входящим параметрам
источник

tn

tot samiy neizvestni... in Python Flask
Aryn
Дак тут 13 строк
На телефоне это очень вырвиглазно смотрится
источник

MB

Max Block in Python Flask
db.query(Tx).filter(Tx.tx_hash.in_(txs)).update(
   {"block_number": block_number, "block_at": now_utc()}, synchronize_session=False,
)


Подскажите, почему в этом коде алхимии случается (psycopg2.errors.DeadlockDetected) deadlock detected?

Разве synchronize_session=False не говорит о том, чтобы вообще никакой синхронизации не делать?
источник

АП

Агент Печенька... in Python Flask
Это синхронизация сессии, а ты ловишь дедлок. Разные вещи.
источник

MB

Max Block in Python Flask
Агент Печенька
Это синхронизация сессии, а ты ловишь дедлок. Разные вещи.
А почему там вообще DeadLock случается? Да, у меня там все в куче потоков делается.

Работа с БД делается через создание сессии в каждый случай. Т.е. в коде будет что-то типа
def service_func():
 with db_session() as db:
   db.query(….


Сессия получается так:
de
f db_session() -> ContextManager[Session]:
   @contextmanager
   def _db_session():
       session: Session = DBSession()
       try:
           yield session
           session.flush()
           session.expunge_all()
           session.commit()
       finally:
           session.close()

   return _db_session()

Проблема случилась только именно в этом месте, где делается db.query(Model).filter(Model.field.in_(large_list)).update()

— Т.е. есть запрос in по списку где-то из 200 элементов.
источник

T

Tishka17 in Python Flask
так, флаш и expunge тут лишние
источник

T

Tishka17 in Python Flask
дэд лок может быть если ты в конкурентных запросах делаешь операции с одними объектами в разном порядке
источник

T

Tishka17 in Python Flask
сколько  у тебя запросов в транзакции?
источник

MB

Max Block in Python Flask
Tishka17
сколько  у тебя запросов в транзакции?
Один запрос в этой одной транзакции.
Целиком проблемный метод выглядит так:
def set_block_number(block_number: int, txs: List[str]):
   with db_session() as db:
       db.query(Tx).filter(Tx.tx_hash.in_(txs)).update(
           {"block_number": block_number, "block_at": now_utc()}, synchronize_session=False,
       )


Единственное что в других нитях в теории может еще использоваться, так это параметр txs. Хотя врядли, но сейчас проверю...
источник

T

Tishka17 in Python Flask
ошибка точно на этом запросе?
источник

MB

Max Block in Python Flask
Tishka17
так, флаш и expunge тут лишние
Эх, и чего я комменты в коде не пишу :(

Я эти flush и expunge_all для чего-то писал. Точно вначале я без них все делал, случилась какая-то проблема, их я и добавил. Но не помню уже что за проблема была, зачем я их написал.
источник

T

Tishka17 in Python Flask
так как коммит и клоуз, они не нужны
источник

T

Tishka17 in Python Flask
хотя expunge_all не уверн, если ты юзашеь объекты потом после закрытия сессии
источник

MB

Max Block in Python Flask
Tishka17
ошибка точно на этом запросе?
Да, ошибка точно в этом запросе. Вот полный лог: https://pastebin.com/uzkQjYFg

С expunge_all наверное как раз для этого и делал, чтобы получать после закрытия сессия айдишник нового объекта.
источник