Python+sqlAlchemy:动态将dtype对象更改为字符串

3
简而言之,我想动态地将所有Pandas数据框中的对象列转换为字符串。 我看到了一些关于单个转换的帖子,但没有一个处理动态转换成字符串的方法。
我正在使用Python 3.x将多个JSON文件写入我们的SQL Server数据库。 当我导入JSON文件并将其存储在Pandas DF中时,由于长度未知,所有字符串都存储为对象。 因此,当我将数据写入SQL Server时,选择的数据类型是text而不是varchar(255)。
是否有一种方法可以动态地将所有dtype为object的列转换为dtype为string? 这些字符串可能会在前255个字符处被截断。
我尝试了以下方法,但导致Python崩溃...
url = 'some-url-to-json-file'
params['connectionString'] = 'driver://user:pw@server/database'
engine = sqlalchemy.create_engine(connectionString)
response = requests.get(url)
pandasDF = pandas.DataFrame(response.json()['value'])

# Convert Objects to Strings
for cName in list(pandasDF.columns.values):
    if pandasDF[cName].dtype == 'object':
        pandasDF[cName] = pandasDF[cName].to_string
pandasDF.to_sql(tableName, engine, if_exists = 'append')
2个回答

6
您可以在识别出数据框中存在的对象列后,使用 sqlalchemyString 类型替代默认的 Text 类型。
to_sql 中使用 dtype 参数,并提供一个字典映射这些列与 sqlalchemy.sql.sqltypes.String,如下所示:
from sqlalchemy.types import String

obj_cols = pandasDF.select_dtypes(include=[object]).columns.values.tolist()
pandasDF.to_sql(tableName, engine, if_exists='append', dtype={c: String for c in obj_cols})

这将把你的对象数据映射到String SQL数据类型。


2

pandas数据框没有字符串类型。'Object' dtype是一个万能类型,可以存储多种不同类型的数据,例如字符串、列表或字典等。您需要先在SQL Server中创建具有所需类型的表格。您可以通过SQLAlchemy在Python中完成此操作。然后Pandas就能够添加与您创建的表格类型相匹配的行。

这是文档中关于更改pandas数据类型映射的章节

您始终可以通过使用dtype参数指定任何列的期望SQL类型来覆盖默认类型。此参数需要将列名映射到SQLAlchemy类型(或sqlite3回退模式的字符串)的字典。例如,为了使用SQLAlchemy 'String'类型而不是默认的'Text'类型来存储字符串列:

from sqlalchemy.types import String

data.to_sql('data_dtype', engine, dtype={'Col_1': String})

以下是 sqlalchemy.types 中的所有类型列表:

'ARRAY','BIGINT','BINARY','BLOB','BOOLEAN','BigInteger','Binary','Boolean','CHAR','CLOB','Concatenable','DATE', 'DATETIME','DECIMAL','Date','DateTime','Enum','FLOAT','Float', 'INT','INTEGER','Indexable','Integer','Interval','JSON', 'LargeBinary','MatchType','NCHAR','NULLTYPE','NUMERIC', 'NVARCHAR','NullType','Numeric','PickleType','REAL','SMALLINT', 'STRINGTYPE','SchemaType','SmallInteger','String','TEXT','TIME', 'TIMESTAMP','Text','Time','TypeDecorator','TypeEngine','Unicode', 'UnicodeText','UserDefinedType','VARBINARY','VARCHAR','Variant', '_Binary'

注:请保留html标签。

你不需要创建表格,我猜测。如果它不存在,pandas会创建它。如果它已经存在,你可以追加数据。 - undefined
谢谢您的快速回复。我正在为如何根据底层JSON文件的结构动态创建表格而苦恼。是否有一种简单的方法可以使用SQLAlchemy在MSSQL中创建表格,并使用JSON文件中提供的变量/数据类型? - undefined
它确实创建了一个表,但不是所期望的结构(使用文本而不是varchar)。在SQL中,是否有一种简单的方法可以选择varchar而不是text,使用sqlalchemy提供的to_sql函数? - undefined
@Dendrobates 在 df.to_sql 中有一个 schema 参数。请检查一下。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接