我有一個名為 Data2 的資料框,我希望將它的值放在 postgresql 表中。由于某些原因,我不能使用 to_sql,因為 Data2 中的某些值是 numpy 陣列。
這是 Data2 的架構:
cursor.execute(
"""
DROP TABLE IF EXISTS Data2;
CREATE TABLE Data2 (
time timestamp without time zone,
u bytea,
v bytea,
w bytea,
spd bytea,
dir bytea,
temp bytea
);
"""
)
我的代碼段:
for col in Data2_mcw.columns:
for row in Data2_mcw.index:
value = Data2_mcw[col].loc[row]
if type(value).__module__ == np.__name__:
value = pickle.dumps(value)
cursor.execute(
"""
INSERT INTO Data2_mcw(%s)
VALUES (%s)
"""
,
(col.replace('\"',''),value)
)
產生的錯誤:
psycopg2.errors.SyntaxError: syntax error at or near "'time'"
LINE 2: INSERT INTO Data2_mcw('time')
我該如何糾正這個錯誤?
任何幫助將非常感激!
uj5u.com熱心網友回復:
我看到這段代碼有兩個問題。
第一個問題是不能對列名使用系結引數,只能對值使用系結引數。%sSQL 字串中兩個占位符中的第一個無效。您必須使用字串連接來設定列名,如下所示(假設您使用的是 Python 3.6 ):
cursor.execute(
f"""
INSERT INTO Data2_mcw({col})
VALUES (%s)
""",
(value,))
第二個問題是 SQLINSERT陳述句插入一整行。它不會像您所期望的那樣將單個值插入到已經存在的行中。
假設您的資料框Data2_mcw如下所示:
a b c
0 1 2 7
1 3 4 9
顯然,這個資料幀中有六個值。如果你在這個資料幀上運行你的代碼,那么它會在你的資料庫表中插入六行,每個值一行,表中的資料如下所示:
a b c
1
3
2
4
7
9
我猜你不想要這個:你寧愿你的資料庫表包含以下兩行:
a b c
1 2 7
3 4 9
您必須一次插入一整行,而不是一次插入一個值。這意味著您必須交換兩個回圈,預先構建一次 SQL 字串,并在將一行的所有值傳遞到資料庫之前將其收集在一起。像下面這樣的東西應該可以作業(請注意,我沒有一個 Postgres 資料庫來測驗這個):
column_names = ",".join(Data2_mcw.columns)
placeholders = ",".join(["%s"] * len(Data2_mcw.columns))
sql = f"INSERT INTO Data2_mcw({column_names}) VALUES ({placeholders})"
for row in Data2_mcw.index:
values = []
for col in Data2_mcw.columns:
value = Data2_mcw[col].loc[row]
if type(value).__module__ == np.__name__:
value = pickle.dumps(value)
values.append(value)
cursor.execute(sql, values)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/341499.html
標籤:Python sql PostgreSQL 数据框
上一篇:具有相同場的棱鏡關系
