2016-12-28 208 views
1

简而言之:我想将对象动态地转换为我所有Pandas数据框中所有对象列的字符串。我看到有关单个转换的类似帖子,但没有一个处理动态转换为字符串。Python + sqlAlchemy:将dtype对象更改为动态字符串

我正在使用Python 3.x编写多个JSON文件到我们的SQL Server数据库。当我导入JSON文件并将其存储在Pandas DF中时,所有字符串都将作为对象存储,因为该长度事先未知。因此,当我将数据写入到SQL Server中,数据类型选择为text而非varchar(255)

有没有一种方法可以动态转换的所有列与D型object到D型string?字符串可能会在前255个字符处剪切。

我尝试以下,但做的Python崩溃......

url = 'some-url-to-json-file' 
params['connectionString'] = 'driver://user:[email protected]/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

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

使用在to_sqldtype参数,并与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

没有为大熊猫dataframes没有字符串类型。 'Object'dtype对于各种不同类型(如字符串,列表或字典)都是全面的。您需要首先在您的sql server中使用您需要的指定类型创建表。您应该使用sql server提供的create table语句来执行此操作。你可以在python中通过sqlalchemy完成这一切。然后熊猫应该能够添加与您创建的表中的类型相匹配的行。

以下是关于更改熊猫dtypes映射的section in the documentation

通过使用dtype参数指定所需的任何列的SQL 类型,您始终可以覆盖默认类型。该参数 需要将字段映射到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','布尔','CHAR','CLOB','Concatenable','DATE', 'DATETIME' ,'DECIMAL','Date','DateTime','Enum','FLOAT','Float', 'INT','INTEGER','Indexable','Integer','Interv '''','','','''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' SMALLINT', 'STRINGTYPE','SchemaType','SmallInteger','String','TEXT','TIME', 'TIMESTAMP','Text','Time','TypeDecorator','TypeEngine','统一”, 'UnicodeText', 'UserDefinedType', 'VARBINARY', 'VARCHAR', '变', '4.1.x或更高版本'

+0

您不必创建我猜的表格。如果它不存在,熊猫会创建它。如果它已经存在,可以追加。 – MYGz

+0

Thx为您的快速回复。我正在努力解决如何在给定底层JSON文件结构的情况下动态创建表的问题。有没有一种简单的方法可以在MSSQL中创建表,使用sqlalchemy和JSON文件中给出的变量/数据类型? – Dendrobates

+0

它的indeises创建一个,但不是与所需的结构(文本,而不是varchars)。使用sqlalchemy提供的to_sql函数,是否有一种简单的方法可以选择varchars而不是SQL中的文本? – Dendrobates

相关问题