我试图获取MySQL列的类型,并以python中的字符串形式检索它们。它们不是真正的函数,而是可以签名或不能签名的数据类型。
示例:
someString = 'bigint(20)'
需要字符串someString
:
datatype = {'type': 'bigint', 'length': 20 }
如果类型没有具体限制或无法签名
someString = 'text'
需要字符串someString
:
datatype = {'type': 'bigint', 'length': None }
答案 0 :(得分:1)
正则表达式可以直接提取您描述的字段:
>>> re.match(r'^(?P<type>[^(]+)(?:\((?P<length>\d+)\))?$', 'bigint(20)').groupdict()
{'type': 'bigint', 'length': '20'}
^
和$
匹配字符串的开头和结尾。(?P<type>...+)
捕获一个名为type
的组
[^(]+
匹配一个或多个不是 (
(?:\(...\))?
与括号中包含的可选组匹配
(?P<length>...)
捕获一个名为length
的组
\d+
匹配一个或多个数字请注意,如果您经常需要正则表达式,则可能需要对其进行预编译。请参阅Python's builtin regular expression module的文档。
如果要避免使用正则表达式,也可以使用字符串方法。这使您可以逐步划分和剥离输入:
def parse_type(literal):
name, _, length = literal.partition('(')
if not length:
return {'type': name, 'length': None}
return {'type': name, 'length': length.strip(')')}
这是以牺牲可读性为代价的速度和健壮性。
请注意,在两种情况下,您都将length
作为字符串而不是整数。您必须对其进行显式转换:
result = parse_type('bigint(20)')
result['length'] = int(result['length']) if result['length'] is not None else None
答案 1 :(得分:1)
此处要注意的重要一点是bigint(20)
表示一个8字节整数,显示时将填充为20个字符的长度,而 not 20个字节的整数。
您可以使用cursor
属性通过使用descrption
对象来轻松获取此信息。它提供有关最后执行的查询的列类型的元信息。例如。
from mysql.connector import FieldType
cursor = ...
cursor.execute("<some query>")
rows = cursor.fetchall()
for desc in cursor.description:
col_name = desc[0]
col_type = desc[1] # would be a number representing bigint in your case
col_display_length = desc[2] # would be 20 in your case
col_internal_size = desc[3] # number of bytes used to store the field (8 for bigint)
print("Column {} has type {} with width {}".format(
col_name,
FieldType.get_info(col_type), # convert the number to type information
col_display_length
))
您可以在此处找到有关说明内容的更多信息:https://www.python.org/dev/peps/pep-0249/#cursor-attributes