sqlalchemy.exc.DataError:(psycopg2.DataError)值对于类型字符变化而言太长

时间:2017-06-23 08:16:54

标签: python postgresql sqlalchemy psycopg2

我尝试使用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如何增加传递字符串的大小!现在我正试图阻止它!

2 个答案:

答案 0 :(得分:1)

问题不是关于映射或charset或sql Alchemy中的任何类似的事情! 这是我的代码!当我尝试将散列结果转换为base64字符串时,结果将是一个BinaryString!不是字符串。

  

'密码':b' i1SlFeDkCZ0BJYanhING ....

所以要解决这个问题我需要将base64结果解码为unicode字符串,以便将其保存到数据库中!

  

u.password = u.password.decode(" utf-8","忽略")

答案 1 :(得分:-1)

出现此问题是由于postgresql和其他ORM数据结构定义严格的类型,而不像SQL那样宽松。我已经从两个方面发现了问题

  1. db.Column定义
  2. 按方法发布数据应遵循模型方法args顺序

由于上述情况可能不会影响SQLAlchemy db交互,因此迁移到其他ORM要求您符合上述条件。

  1. 表定义

    __tablename__ = 'test'
    
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    accountNumber = db.Column(db.String(255))
    description = db.Column(db.String(255), nullable=False)
    accountType = db.Column(db.String(255), nullable=False)
    
  2. 按列角色顺序发布数据

    createAccount(accountNumber, description, accountType)