【问题标题】:Why SQLAlchemy send null value for id primary column?为什么 SQLAlchemy 为 id 主列发送空值?
【发布时间】:2021-07-26 14:17:54
【问题描述】:

我正在尝试构建一个用户注册页面并面临以下问题:
出于某种原因,sqlalchemy 为 postgresql 数据库形成了这一行 - (null, roman, 2021-05-04),但我已经在用户模型中传递了 id 列是主键(所以不是 NULL)
我通过 pgAdmin4 在数据库中创建了表
我不知道为什么会这样,因为我使用了相同的代码,但用于 MySQL 和 SQLite 并且它可以工作

models.py

class User(UserMixin, db.Model):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    registration_date = db.Column(db.DateTime, nullable=False)

    def __init__(self, username, registration_date):
        self.username = username
        self.registration_date = registration_date

routes.py

@app.route('/register', methods=['POST', 'GET'])
def register():
    form = RegistrationForm()
    if form.validate_on_submit():
        user = User(username=form.username.data,
                    registration_date=datetime.now(),
                    )
        db.session.add(user)
        db.session.commit()
        flash('User was created!', 'success')
        return redirect(url_for('login'))
    return render_template('register.html', form=form)

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    该列的类型为INTEGERPRIMARY_KEY,但没有任何默认值,因此当尝试在其中插入具有null 值的行时,您会收到错误消息。

    postgreSQL 上的表是如何定义的?我建议使用identity 写的here

    create table t2 (id integer primary key generated always as identity);
    

    【讨论】:

      【解决方案2】:

      表的结构不是 SQLAlchemy 对您的模型所期望的。如果我们让 SQLAlchemy 创建表,它将是

      CREATE TABLE users (
          id SERIAL NOT NULL, 
          username VARCHAR(20) NOT NULL, 
          registration_date TIMESTAMP WITHOUT TIME ZONE NOT NULL, 
          PRIMARY KEY (id), 
          UNIQUE (username)
      )
      

      所以 SQLAlchemy 不会尝试插入“id”列

      INSERT INTO users (username, registration_date) VALUES (%(username)s, %(registration_date)s) RETURNING users.id
      [generated in 0.00079s] {'username': 'gord', 'registration_date': datetime.datetime(2021, 5, 4, 10, 53, 9, 930021)}
      

      这显然对您自己创建的表无效。

      【讨论】:

        猜你喜欢
        • 2023-01-02
        • 1970-01-01
        • 2020-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-22
        • 1970-01-01
        • 2019-10-29
        相关资源
        最近更新 更多