Вы также можете использовать соединения, используя потрясающий пакет dplyr Хэдли Уикхэма].
library(dplyr)
#make sure that CustomerId cols are both type numeric
#they ARE not using the provided code in question and dplyr will complain
df1$CustomerId <- as.numeric(df1$CustomerId)
df2$CustomerId <- as.numeric(df2$CustomerId)
#inner
inner_join(df1, df2)
#left outer
left_join(df1, df2)
#right outer
right_join(df1, df2)
#alternate right outer
left_join(df2, df1)
#full join
full_join(df1, df2)
semi_join(df1, df2) #keep only observations in df1 that match in df2.
anti_join(df1, df2) #drops all observations in df1 that match in df2.
да, вы можете:
from sqlalchemy import create_engine
from sqlalchemy.pool import StaticPool
eng = create_engine("mssql+pyodbc://", poolclass=StaticPool, creator=lambda: my_odbc_connection)
однако, если у вас действительно есть только одно уже созданное соединение, в отличие от вызываемого, которое их создает, вы должны использовать этот движок только в одном потоке, один одновременно. Это не является потокобезопасным для использования в многопоточном приложении.
Если OTOH вы действительно можете получить функцию Python, которая создает новые соединения при вызове, это гораздо больше appopriate:
from sqlalchemy import create_engine
eng = create_engine("mssql+pyodbc://", creator=my_odbc_connection_function)
вышеупомянутый движок нормально соединяет соединения и может использоваться свободно как источник подключения.