我正在尝试在我的Discord机器人中使用sqlalchlemy来记录员工和我们的用户之间的对话。
大多数情况下,事情都会被记录下来,但最近开始在向表中插入数据时遇到一些问题。
我们使用sqlalchemy插入到数据库中。我不是专家,所以可能创建了一些错误的东西。
下面是表对象:
engine = create_engine("mysql+pymysql://%s:%s@%s/%s" % (db_user, db_pass, db_host, database), echo = True)
meta = MetaData()
logs = Table(
'logs', meta,
Column('id', Integer, primary_key=True, autoincrement=True, nullable=False),
Column('agent', VARCHAR(45), nullable=False),
Column('starttime', DATETIME, nullable=False),
Column('endtime', DATETIME, nullable=False),
Column('osid', VARCHAR(20), nullable=True),
Column('nickname', VARCHAR(45), nullable=False),
Column('discorduid', VARCHAR(30), nullable=False),
Column('log', String(99999999999999999999999999999999999999), nullable=False),
Column('tags', VARCHAR(45), nullable=True)
)
insert = logs.insert()
insert = logs.insert().values(agent=agent, starttime=start, endtime=end, osid='', nickname=user, discorduid=uid, log=messages, tags=tags)
connection = engine.connect()
result = connection.execute(insert)以下是数据库中表的相关信息:
MariaDB [discord]> describe logs;
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| agent | varchar(45) | NO | | NULL | |
| starttime | datetime | NO | | NULL | |
| endtime | datetime | NO | | NULL | |
| osid | varchar(20) | YES | | NULL | |
| nickname | varchar(45) | NO | | NULL | |
| discorduid | varchar(30) | NO | | NULL | |
| log | longtext | NO | | NULL | |
| tags | varchar(45) | YES | | NULL | |
+------------+-------------+------+-----+---------+----------------+我收到的错误似乎显示通过insert = logs.insert().values(agent=agent, starttime=start, endtime=end, osid='', nickname=user, discorduid=uid, log=messages, tags=tags)的日志log=messages列溢出到我下面的tags列中,并编辑了一些数据:
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: DataError: (pymysql.err.DataError) (1406, "Data too long for column 'tags' at row 1")
[SQL: INSERT INTO logs (agent, starttime, endtime, osid, nickname, discorduid, log, tags) VALUES (%(agent)s, %(starttime)s, %(endtime)s, %(osid)s, %(nickname)s, %(discorduid)s, %(log)s, %(tags)s)]
[parameters: {'agent': 'X', 'starttime': datetime.datetime(2021, 5, 26, 19, 50, 55, 863000), 'endtime': datetime.datetime(2021, 5, 26, 20, 39, 56, 392000), 'osid': '', 'nickname': 'X', 'discorduid': 'X', 'log': 'OffSec Ninja:\nHello X - this chat has been initiated by X so that we can better assist you.\n\nX:\nHi X how are yo ... (5500 characters truncated) ... com/attachments/847200149520515102/847212337203380234/somefile.PNG\n\n\X:\nthe last buffer is the one that I\'m changing from 5092 to 5098\n\n', 'tags': "last buffer is the one that I'm changing from 5092 to 5098"}]当支持代理关闭专用1对1通道时,将填充tags列。
我检查了我要插入的messages数据的长度,结果是5462。
这是否是mysql的一个限制,以及它可以在一行中存储多少空间?或者我只是搞砸了我的桌子对象?
发布于 2021-05-27 06:57:44
之所以会出现这个错误,是因为SQL试图将"last buffer is The one,I'm changing from 5092 to 5098“(一个58个字符的字符串)插入到VARCHAR(45)中。太长了。
我从来没有听说过MySQL允许文本内容在列之间溢出。它就是不会这么做。因此,一定是Python变量messages和tags包含您在错误中看到的文本,然后您的代码才会尝试将它们插入到表中。按照设置Python变量的方式进行调试。
https://stackoverflow.com/questions/67713420
复制相似问题