无法将元组插入到 mssql db

Posted

技术标签:

【中文标题】无法将元组插入到 mssql db【英文标题】:Can't insert tuple to mssql db 【发布时间】:2014-04-23 12:34:59 【问题描述】:

我在 Python 3.3 中使用 pymssql 与我的 Mssql 数据库通信。我正在尝试将用户的数据以元组的形式保存到数据库中,但我不断收到这个奇怪的错误:

pymssql.ProgrammingError: (102, b"Incorrect syntax near '\\'.DB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\n")

我的方法,错误显示在最后一行:

    user.password = user.password.encode('utf_8')
    user.password = encrypt_RSA(user.password)

    cursor.execute('INSERT INTO Usertable VALUES(%i, \'%s\', \'%s\', \'%s\', \'%s\', \'%s\', \'%s\')' % user.get_usertuple())

我怀疑它与编码和加密有关:

def encrypt_RSA(message, public_key_loc = "pubkey.pem"):
    '''
    param: public_key_loc Path to public key
    param: message String to be encrypted
    return   encoded encrypted string
    '''
    key = open(public_key_loc, "r").read()
    rsakey = RSA.importKey(key)
    rsakey = PKCS1_OAEP.new(rsakey)
    encrypted = rsakey.encrypt(message)
    return encrypted

谁能告诉我在这里做错了什么?以及如何解决?

编辑: 我的查询现在看起来像这样:

cursor.execute('INSERT INTO Usertable VALUES(%i, %s, %s, %s, %s, %s, %s)' % user.get_usertuple()) 

But that gives me another error: pymssql.OperationalError: (103, b"The identifier that starts with (LONG TEXT)  is too long. Maximum length is 128.DB-Lib error message 103, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\n")

【问题讨论】:

不是运行 cursor.execute,而是尝试打印它以检查查询是否正确呈现? Check messages from the SQL Server 你这样做了吗? 打印出来好像没问题,我认为问题与它是字节数据有关。所以密码打印出来是这样的:b'x10//...等。我猜b'可能存在一些问题? 【参考方案1】:

使用绑定变量。它更安全,对数据库更友好。

cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')

您的字符串将自动正确地用引号括起来。

【讨论】:

见编辑,我猜这就是你的意思 我有逗号(,),你有百分比(%)。不同之处在于我传递了 2 个参数,而你只传递了一个(这是一个格式化的字符串)。它仍然不是绑定变量。

以上是关于无法将元组插入到 mssql db的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将元组序列化为键字典

如果不存在条件mysql则插入一个元组

减少单词列表,将元组计数到聚合键

如何将元组列表解压缩到单个列表中? [复制]

如何将元组类型转换为联合?

SQLAlchemy 无法连接到 mssql 数据库