Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python flask_sqlalchemy使用字符串哈希作为主键_Python_Sqlalchemy - Fatal编程技术网

Python flask_sqlalchemy使用字符串哈希作为主键

Python flask_sqlalchemy使用字符串哈希作为主键,python,sqlalchemy,Python,Sqlalchemy,如何修改此示例以将用户名字段的sha256值用作主键,而不是自动递增索引 from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db' db = SQLAlchemy(app) class User(db.Model): id = db.Colu

如何修改此示例以将
用户名
字段的
sha256
值用作
主键
,而不是
自动递增索引

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return '<User %r>' % self.username
从烧瓶导入烧瓶
从flask_sqlalchemy导入sqlalchemy
app=烧瓶(名称)
app.config['SQLALCHEMY\u DATABASE\u URI']='sqlite:////tmp/test.db'
db=SQLAlchemy(应用程序)
类用户(db.Model):
id=db.Column(db.Integer,主键=True)
username=db.Column(db.String(80),unique=True,nullable=False)
email=db.Column(db.String(120),unique=True,nullable=False)
定义报告(自我):
返回“%self.username”
示例如下:

有很多方法可以做到这一点,但最简单的方法是在routes.py文件中:

...
from hashlib import sha256

@app.route('/register') 
def register():

    if form.validate_on_submit():
        username_hash = sha256(form.username.data.encode()).hexdigest()
        user = User(id=username_hash)
     ...
正如你所看到的,这有几个部分。用户名通常是
str
,必须调用
encode
才能成为
bytes
类型。然后,只需从标准库调用sha256,
hexdigest
就是返回哈希值的方法

拥有一个“唯一的”散列可能很有用,但拥有一个唯一的整数id也很有用,它不会被重复,并且可以很容易地引用。为了调试和查找flask shell中的用户,使用简单的整数进行查找可能比使用其他属性或散列更容易

这可能更简单:

User.query.get(14)

而不是对主id使用哈希。

您不应该将哈希用作主键。散列不是唯一的。自动递增索引有什么问题?这是几乎所有主键的最佳选择。我不想插入重复的用户名。如果不想插入重复的用户名,则必须使用户名唯一。你已经这么做了。我想使用一个类似的表,但是使用URL,而不是用户名。url可能相当长,我考虑的是
TEXT
而不是
VARCHAR
。我在
hash\u url
列上添加了
unique
约束。我在
hash\u url
列上添加了
unique
约束。谢谢你解释逻辑。