我尝试使用SQL Alchemy在postgresql数据库中保存散列密码。表脚本是:
Create Table "User"(
Id serial Primary key,
UserName varchar(50) unique not null,
Nikname varchar(50) not null,
"password" varchar(172) not null,
FirstName varchar(75) not null,
LastName varchar(75) not null,
BirthDate date not null,
CreateDate date not null,
Status smallint Not null
)这是地图:
user = Table('User', metadata,
Column('id', Sequence(name='User_id_seq'), primary_key=True),
Column('username', String(50), unique=True, nullable=False),
Column('nikname', String(50), nullable=False),
Column('firstname', String(75), nullable=False),
Column('lastname', String(75), nullable=False),
Column('password', String(172), nullable=False),
Column('status', Integer, nullable=False),
Column('birthdate', Date, nullable=False),
Column('createdate', Date, nullable=False)
)当我尝试插入数据时,会引发以下异常:
sqlalchemy.exc.DataError: (psycopg2.DataError) value too long for type character varying(172)
[SQL: 'INSERT INTO "User" (id, username, nikname, firstname, lastname, password, status, birthdate, createdate) VALUES (nextval(\'"User_id_seq"\'), %(username)s, %(nikname)s, %(firstname)s, %(lastname)s, %(password)s, %(status)s, %(birthdate)s, %(createdate)s) RETURNING "User".id'] [parameters: {'username': 'hoseinyeganloo@gmail.com', 'nikname': 'Laughing Death', 'firstname': 'Hosein', 'lastname': 'Yegnloo', 'password': b'i1SlFeDkCZ0BJYanhINGCZC80rqVYABHAS/Ot2AWDgzPZCtshMNRZGHeosx3PvLqsCWzZfPZpsT+UZZLShmQxfbO5VJ4xJbLNjbb0n8HuazQy+0u5Ws2DCtmdDh+HFBTKCAiNuzUGueurP9d2VE3tHwHpX+hCMS1RB4KIOUORKw=', 'status': 1, 'birthdate': datetime.datetime(1990, 3, 1, 0, 0), 'createdate': datetime.datetime(2017, 6, 23, 0, 0)}]但是,正如您所看到的,数据非常合适,而且当我在pgadmin中执行这个查询时,没有错误!我觉得问题出在我的地图上。我将字符串更改为文本,但错误抵抗:
有什么想法吗?
我不知道它是否有用。当所有字符都是数字时,代码工作就没有错误。
我尝试插入一些数字,而不是散列密码,这是有效的!
更新
我发现问题是字符编码!有些SQLAlchemy是如何增加传递字符串的大小的!现在我正试着阻止它!
发布于 2017-06-23 15:00:26
问题不在于映射或字符集,也不是sql炼金术中的任何东西!这是我的密码!当我试图将散列结果转换为base64字符串时,结果将是一个BinaryString!一根绳子也没有。
密码:B‘i1SlFeDkCZ0BJYYHING.
因此,为了解决这个问题,我需要将base64结果解码为unicode字符串,然后保存到数据库中!
u.password = u.password.decode("utf-8",“忽略”)
发布于 2020-07-15 21:49:59
这一问题的出现是因为postgresql和其他ORM数据结构定义是严格类型的,而不是松散的SQL。我已经两次发现了这些问题。
由于上面的内容可能不会影响到SQLAlchemy,所以迁移到其他ORM的db交互需要您遵守上面的规则。
https://stackoverflow.com/questions/44716412
复制相似问题