gpt4 book ai didi

python - 使用 StringEncryptedType、SQLAlchemy 时出现 VARCHAR 长度错误

转载 作者:行者123 更新时间:2023-12-04 08:26:02 37 4
gpt4 key购买 nike

我有以下模型:

from enum import Enum
from sqlalchemy_utils.types.encrypted.encrypted_type import StringEncryptedType
from sqlalchemy import (
Column,
Integer,
Float,
Enum as SQAEnum,
String
)
from backend.db import Base
from backend.config import Config


class AuthProviders(Enum):
google = "Google"
facebook = "Facebook"
vest = "Vest"


class Users(Base):
__tablename__ = "users"

id = Column(Integer, primary_key=True)
email = Column(String(255), unique=True, index=True)
hashed_password = Column(StringEncryptedType(String(255), Config.MYSQL_ENCRYPT_KEY))
auth_provider = Column(SQAEnum(AuthProviders))
timestamp = Column(Float(precision=32))

哪个 alembic 用于生成以下迁移脚本:

from alembic import op
import sqlalchemy as sa
from sqlalchemy_utils.types.encrypted.encrypted_type import StringEncryptedType

from backend.config import Config

# revision identifiers, used by Alembic.
revision = 'b919cf558155'
down_revision = None
branch_labels = None
depends_on = None


def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('users',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('email', sa.String(length=255), nullable=True),
sa.Column('hashed_password', StringEncryptedType(sa.String(255), Config.MYSQL_ENCRYPT_KEY), nullable=True),
sa.Column('auth_provider', sa.Enum('google', 'facebook', 'vest', name='authproviders'), nullable=True),
sa.Column('timestamp', sa.Float(precision=32), nullable=True),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_users_email'), 'users', ['email'], unique=True)
# ### end Alembic commands ###


def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f('ix_users_email'), table_name='users')
op.drop_table('users')
# ### end Alembic commands ###

我添加了行 from sqlalchemy_utils.types.encrypted.encrypted_type import StringEncryptedType 并编辑了 hashed_pa​​ssword 列条目,使其与模型文件匹配。

当我运行数据库升级时,出现以下错误:

sqlalchemy.exc.CompileError: (in table 'users', column 'hashed_password'): VARCHAR requires a length on dialect mysql

我对此感到困惑,因为我已经定义了被加密的 String 的长度。将 String 替换为 VARCHAR 并不能解决问题。

__init__ for StringEncryptedType 非常简单:

def __init__(self, type_in=None, key=None, engine=None, padding=None, **kwargs):

显然,字符串的 EncryptedType 已被弃用,取而代之的是 StringEncryptedType,但很难进行转换。这里还需要发生什么?

最佳答案

传递 String 列类型和一个单独的 length 关键字参数似乎可行。

这个模型

class Users(Base):
__tablename__ = "users20201212a"

id = Column(Integer, primary_key=True)
email = Column(String(255), unique=True, index=True)
hashed_password = Column(StringEncryptedType(String, length=255, key='abc'))
auth_provider = Column(SQAEnum(AuthProviders))
timestamp = Column(Float(precision=32))

生成这个 DDL

CREATE TABLE users20201212a (
id INTEGER NOT NULL AUTO_INCREMENT,
email VARCHAR(255),
hashed_password VARCHAR(255),
auth_provider ENUM('google','facebook','vest'),
timestamp FLOAT(32),
PRIMARY KEY (id)

关于python - 使用 StringEncryptedType、SQLAlchemy 时出现 VARCHAR 长度错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65257560/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com