MySQLdb 的 Integer 字段类型转换,long -> int

使用 MySQLdb 或 SQLAlchemy 的时候,会发现表里的 Integer 字段被默认转换为了 long 类型。这种行为其实是 DB API 做的,即都是 MySQLdb 的错(假设你在使用这个 API 的话)。这是因为 MySQL 的 unsigned int 范围已经超出了 int 的上限,强行使用可能导致溢出。

但 int 的上限在 10 万亿以上,一般用作 ID 的话,在溢出风险和便利性的权衡上其实有很大空间。因此这里给出改变 DB API 默认转换规则的方法。

MySQLdb 从数据库中读出的数据本来都是字符串类型的,对数字和其他特定类型的转换是使用了相应的函数。每种字段类型的转换函数都是可配的。

当独立使用 MySQLdb 时,可以在 connect 函数中传入一个 conv 关键字参数来指定规则:


from MySQLdb.constants import FIELD_TYPE

my_conv = { FIELD_TYPE.LONG: int }
db=_mysql.connect(conv=my_conv...)

详参: 这里

而当使用 SQLAlchemy 时候,办法是一样的。只不过因为 SQLAlchemy 已经默认有了一票转换规则,需要对参数做修改而不是完全覆盖


from MySQLdb.constants import FIELD_TYPE
from MySQLdb.converters import conversions

myconv = conversions.copy()
myconv.update({FIELD_TYPE.LONG: int})
sql_engine = create_engine(***, connect_args={‘conv‘: myconv})

其中 connect_args 里的参数会直接传递给 connect 函数。

时间: 2024-10-07 10:48:39

MySQLdb 的 Integer 字段类型转换,long -> int的相关文章

java 13-4 Integer和String、int之间的转换,进制转换

1.int类型和String类型的相互转换 A.int -- String 推荐用: public static String valueOf(int i) 返回 int 参数的字符串表示形式. B.String -- int 推荐用: public static int parseInt(String s) 将字符串参数作为有符号的十进制整数进行解析 1 public class IntegerDemo { 2 public static void main(String[] args) {

SQL SERVER中某个字段属性为varchar,我想把这个字段改成int型

SQL SERVER中某个字段属性为varchar,我想把这个字段改成int型? 这个就有点恼了,作为新手面对这些问题真有点难,这个也是我在百度上查到的,作为基础的整理吧,以后遇到方便查看. 用SQL语句:alter table [aa] alter column bb int eg: 这个是我的例子. 执行成功可以刷新一下数据库(如还是不可以,那就断开现有连接,再次连接就好.)

Convert integer to string(int类型转化为string类型)

译: 这是一个常见的问题,但是对于这个问题我没有找到一个很好的方法:如何将整数类型转化为字符串类型?我遇到过几种解决方案.我不会使用stringstream.sprintf()函数也遇到了问题,并且它是C语言的风格.函数itoa()以前工作地很好,但参考文档说: 这个函数在ANSI-C中没有被定义,并且它不是C++的一部分,但有些编译器支持 并且这个函数也是C语言风格. 我自己写了一个C++风格的函数,并且它工作起来没有错误(译者注:我不这么认为,详见后文). string convertInt

Java byte类型转换成int类型时需要 & 0XFF的原因

Java byte类型转换成int类型时需要 & 0XFF的原因 假设有byte b  = -1; 那么b的二进制是:1111 1111. 如果将b直接转换为int类型,那么二进制是 1111 1111 1111 1111 1111 1111 1111 1111,这显然就不对了. 所以要与b进行&运算 0XFF的二进制是 0000 0000 0000 0000 0000 0000 1111 1111 那么运算之后到结果就是 0000 0000 0000 0000 0000 0000 111

MySQL时间字段究竟使用INT还是DateTime的说明

今天解析DEDECMS时发现deder的MYSQL时间字段,都是用 `senddata` int(10) unsigned NOT NULL DEFAULT '0'; 随后又在网上找到这篇文章,看来如果时间字段有参与运算,用int更好,一来检索时不用在字段上转换运算,直接用于时间比较!二来如下所述效率也更高. 归根结底:用int来代替data类型,更高效. 环境: Windows XP PHP Version 5.2.9 MySQL Server 5.1 第一步.创建一个表date_test(非

C#/.NET整数的三种强制类型转换(int)、Convert.ToInt32()、int.Parse()的区别

这三种方式都是强制把内容转换为整数,但他们之间是有区别的,如下: 一.(int)适合简单数据类型之间的转换,C#的默认整型是int32(不支持bool型). 二.int.Parse(string sParameter)是个构造函数,参数类型只支持string类型,Parse就是把String类型转换成int,char,double....等,也就是*.Parse(string) 括号中的一定要是string类型. 三.Convert.ToInt32()适合将Object类型转换为int型:Con

如何把datetime类型字段修改为int类型

如何把datetime类型字段修改为int类型 我有一个表为:table1 其中有一个datetime类型的字段  a    现在我想我想把字段a的类型改为int类型 当我执行以下命令时报如下的错误alter table table1 alter column a int null报错:不充许从数据类型datetime到数据类型int的隐性转换   表table1,列a 请用convert函数来运行此查询 本人想求:能不能通过alter命令来修改得出呢?中间通过什么转换函数直接出呢.如conve

iOS 当用到第三方的文件的时候,警告 implicit conversion loses integer precision:'long' to 'int '

在我们的项目中,通常使用了大量的第三方代码,这些代码可能很复杂,我们不敢改动他们,可是作者已经停止更新了,当sdk升级或者是编译器升级后,这些遗留的代码可能会出现许许多多的警告,那么我们有没有办法去掉这些烦人的警告,不然一个工程几百个警告,我们怎么去掉警告呢 ,对于第三方,我们肯定是不想改动它的,尤其是一些更新很频繁的第三方,一般警告出现后不久,作者就更新了,我们在此做这样的操作,就显得浪费了.并且在 添加arm64支持的时候,一下出现几百个某种类型的警告,改起来也是相当费时费力 1:关闭某一个

Why Python's Integer Division Floors ---- python int(6/-132)时答案不一致,向下取整

leetcode150题中有一个步骤: int(6/-132) == 0 or ==-1? 在自己本地python3环境跑是int(6/-132) =0,但是提交的时候确实-1. 查找相关资料解惑: Why Python's Integer Division Floors为何Python整除运算采用向下取整的规则 今天(又)有人问我,为什么Python中的整除(integer division)返回值向下取整(floor)而不是像C语言中那样向0取整. 在正整数范围内,两者并无实质差别,例如: