我有一个SQL Server数据库,里面有几个表。所有的表都已经创建好了,带有自动递增的键和我需要的所有列。
现在我想从一个dataframe向一个表中写入额外的行。
def write_to_database(self, s_table, df):
s_host = 'localhost'
s_driver = 'SQL Server'
port = 1433
s_database = 'test'
d_users = {
'admin': ('censored', 'censored'),
'user': ('censored', 'censored'),
}
s_username, s_pw = d_users.get('user', ('empty', 'empty'))
mysql_engine = create_engine(
f"mssql+pyodbc://{s_username}:{s_pw}@{s_host}:{port}/{s_database}?driver={s_driver}",
pool_reset_on_return=None, # disable default reset-on-return scheme
use_setinputsizes=False
)
con = mysql_engine.connect()
df.to_sql(name=f'type__{s_table}', con=con, if_exists='append', index=False)
但我得到了这个例外:
pyodbc.ProgrammingError:('42000',“[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]CREATE TABLE权限在数据库'{test'中被拒绝。(262)(SQLExecDirectW)”)
我不想创建新表。我想添加到现有的一个!
当我使用管理员凭据时,现有的表将被替换为新表。
新表包含所有标题(除了index),但都是text类型,并且自动递增的唯一键不再可用
2条答案
按热度按时间jhiyze9q1#
1.使用“用户”凭据时出现权限错误:错误消息表明指定的用户帐户没有在“test”数据库中创建新表所需的权限。若要解决此问题,应授予“user”帐户将数据插入现有表所需的权限。可以使用SQL Server Management Studio或通过执行适当的SQL命令将目标表的INSERT权限授予“user”帐户来执行此操作。
1.使用“admin”凭据时替换现有表:默认情况下,如果指定的表不存在,Pandas中的
to_sql
方法会创建一个新表。如果要将数据追加到现有表中,则应将to_sql
函数调用中的if_exists
参数修改为'append'。此外,可以使用dtype
参数指定目标表中的列数据类型,以确保它们与原始表结构匹配。确保将
s_table
替换为目标表的实际名称。代码从现有表中检索列数据类型,并在编写DataFrame时使用它们以确保兼容性。46scxncf2#