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
约束。谢谢你解释逻辑。