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

时间:2016-12-28 13:41:50

标签: python pandas sqlalchemy

简而言之:我想在所有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 个答案:

答案 0 :(得分:4)

在识别数据框中存在的String列后,您可以使用 sqlalchemy Text类型而不是默认的object类型。

使用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})

这些会将您的object数据映射到String SQL数据类型。

答案 1 :(得分:1)

pandas数据帧没有字符串类型。 “对象”dtype是各种不同类型(如字符串,列表或词典)的全能型。您需要首先使用所需的指定类型在sql server中创建表。您应该使用sql server提供的create table语句执行此操作。你可以通过sqlalchemy在python中完成所有这些。然后,Pandas应该能够追加与您创建的表中的类型匹配的行。

以下是关于更改pandas dtypes映射的{​​{3}}。

  

您始终可以通过指定所需的SQL来覆盖默认类型   使用dtype参数的任何列的类型。这个论点   需要一个字典映射列名到SQLAlchemy类型(或   sqlite3回退模式的字符串)。例如,指定使用   sqlalchemy字符串类型,而不是字符串的默认文本类型   列:

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','可索引','整数','间隔','JSON',   'LargeBinary','MatchType','NCHAR','NULLTYPE','NUMERIC',   'NVARCHAR','NullType','数字','PickleType','REAL','SMALLINT',   'STRINGTYPE','SchemaType','SmallInteger','String','TEXT','TIME',   'TIMESTAMP','文字','时间','TypeDecorator','TypeEngine','Unicode',   'UnicodeText','UserDefinedType','VARBINARY','VARCHAR','Variant',   '4.1.x或更高版本'