Skip to main content
 首页 » 编程设计

Python+sqlAlchemy : change dtype object to string dynamically

2025年05月04日1698°冷暖

简而言之:我想为所有 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') 

请您参考如下方法:

您可以使用 sqlalchemy String 类型来代替默认的 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}) 

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