使用 Python 插入包含日期时间和多行的 sql table 数据
Insert into sql table data with datetime and multiple rows using Python
我使用以下代码创建了 sql table:
CREATE Table [dataISO].[dbo].[LMP](
[DateTime] [datetime] NOT NULL,
[ISO] [nvarchar](50) NOT NULL,
[pwrLoc] [nvarchar](50) NOT NULL,
[da] [int] NULL,
[rt] [int] NULL
CONSTRAINT [PK_daLMP] PRIMARY KEY CLUSTERED
(
[DateTime] ASC,
[ISO] ASC,
[pwrLoc] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = ON, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 20) ON [PRIMARY]
) ON [PRIMARY]
我有一个包含列的数据框:
data.ix[1:4]
DateTime ISO pwrLoc DA RT
1 2013-09-05 02:00:00 ERCOT LZ_AEN 24.66 25.4100
2 2013-09-05 03:00:00 ERCOT LZ_AEN 23.17 24.3750
3 2013-09-05 04:00:00 ERCOT LZ_AEN 22.20 23.9225
4 2013-09-05 05:00:00 ERCOT LZ_AEN 22.45 23.9625
我正在尝试将 data
插入 table LMP
:
values = [tuple(row) for row in data.values]
dateInfoQry = 'insert into [dataISO].[dbo].[LMP] (DateTime, ISO, pwrLoc, da, rt) values {}'.format(values)
conn = pyodbc.connect(r'Driver={SQL SERVER}; SERVER=2UA7491NP7\SQLEXPRESS')
conn.execute(dateInfoQry)
我收到以下错误:
pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]The identifier that starts with '(Timestamp('2013-09-05 01:00:00'), 'ERCOT', 'LZ_AEN', 28.31, 34.5325), (Timestamp('2013-09-05 02:00:00'), 'ERCOT', 'LZ_AEN', 24.' is too long. Maximum length is 128. (103) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near '(Timestamp('2013-09-05 01:00:00'), 'ERCOT', 'LZ_AEN', 28.31, 34.5325), (Timestamp('2013-09-05 02:00:00'), 'ERCOT', 'LZ_AEN', 24.'. (102)")
当我打印您的查询 dateInfoQry
时,我得到了这个结果:
insert into [dataISO].[dbo].[LMP] (DateTime, ISO, pwrLoc, da, rt) values [('2013-09-05 02:00:00', 'ERCOT', 'LZ_AEN', 24.66, 25.41), ('2013-09-05 03:00:00', 'ERCOT', 'LZ_AEN', 23.17, 24.375), ('2013-09-05 04:00:00', 'ERCOT', 'LZ_AEN', 22.2, 23.9225), ('2013-09-05 05:00:00', 'ERCOT', 'LZ_AEN', 22.45, 23.9625)]
您可以看到仍然有一些方括号,因为您将列表 values
作为一个整体包含在内(请参阅 .format(values)
)。但是,如果我使用 .format(','.join(str(v) for v in values))
从中构建一个字符串,我会得到以下应该有效的结果:
insert into [dataISO].[dbo].[LMP] (DateTime, ISO, pwrLoc, da, rt) values ('2013-09-05 02:00:00', 'ERCOT', 'LZ_AEN', 24.66, 25.41),('2013-09-05 03:00:00', 'ERCOT', 'LZ_AEN', 23.17, 24.375),('2013-09-05 04:00:00', 'ERCOT', 'LZ_AEN', 22.2, 23.9225),('2013-09-05 05:00:00', 'ERCOT', 'LZ_AEN', 22.45, 23.9625)
错误说字符串太长,可能是这里的插入语句格式不正确。
始终尝试对 SQL 服务器中的字符串使用单引号。
字符串有“[]”,所以也需要格式化。
insert into [dataISO].[dbo].[LMP] (DateTime, ISO, pwrLoc, da, rt) values [('2013-09-05 02:00:00', 'ERCOT LZ_AEN', '24.66', '25.4100'),('2013-09-05 02:00:00', 'ERCOT LZ_AEN', '24.66', '25.4100')]
所以如果我们将代码修改成这样
values = [tuple(row) for row in data]
dateInfoQry = 'insert into [dataISO].[dbo].[LMP] (DateTime, ISO, pwrLoc, da, rt) values {}'.format(','.join(str(s) for s in values))
插入语句看起来还不错。
insert into [dataISO].[dbo].[LMP] (DateTime, ISO, pwrLoc, da, rt) values ('2013-09-05 02:00:00', 'ERCOT', 'LZ_AEN', 4.66, 5.41),('2013-09-05 02:00:00', 'ERCOT', ' LZ_AEN', 24.66, 25.41)
运行良好。
试一试
尝试添加:
设置QUOTED_IDENTIFIER关闭
在您 插入 之前它应该有所帮助,因为 [] 类似于 SQL 中的“”。
我使用以下代码创建了 sql table:
CREATE Table [dataISO].[dbo].[LMP](
[DateTime] [datetime] NOT NULL,
[ISO] [nvarchar](50) NOT NULL,
[pwrLoc] [nvarchar](50) NOT NULL,
[da] [int] NULL,
[rt] [int] NULL
CONSTRAINT [PK_daLMP] PRIMARY KEY CLUSTERED
(
[DateTime] ASC,
[ISO] ASC,
[pwrLoc] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = ON, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 20) ON [PRIMARY]
) ON [PRIMARY]
我有一个包含列的数据框:
data.ix[1:4]
DateTime ISO pwrLoc DA RT
1 2013-09-05 02:00:00 ERCOT LZ_AEN 24.66 25.4100
2 2013-09-05 03:00:00 ERCOT LZ_AEN 23.17 24.3750
3 2013-09-05 04:00:00 ERCOT LZ_AEN 22.20 23.9225
4 2013-09-05 05:00:00 ERCOT LZ_AEN 22.45 23.9625
我正在尝试将 data
插入 table LMP
:
values = [tuple(row) for row in data.values]
dateInfoQry = 'insert into [dataISO].[dbo].[LMP] (DateTime, ISO, pwrLoc, da, rt) values {}'.format(values)
conn = pyodbc.connect(r'Driver={SQL SERVER}; SERVER=2UA7491NP7\SQLEXPRESS')
conn.execute(dateInfoQry)
我收到以下错误:
pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]The identifier that starts with '(Timestamp('2013-09-05 01:00:00'), 'ERCOT', 'LZ_AEN', 28.31, 34.5325), (Timestamp('2013-09-05 02:00:00'), 'ERCOT', 'LZ_AEN', 24.' is too long. Maximum length is 128. (103) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near '(Timestamp('2013-09-05 01:00:00'), 'ERCOT', 'LZ_AEN', 28.31, 34.5325), (Timestamp('2013-09-05 02:00:00'), 'ERCOT', 'LZ_AEN', 24.'. (102)")
当我打印您的查询 dateInfoQry
时,我得到了这个结果:
insert into [dataISO].[dbo].[LMP] (DateTime, ISO, pwrLoc, da, rt) values [('2013-09-05 02:00:00', 'ERCOT', 'LZ_AEN', 24.66, 25.41), ('2013-09-05 03:00:00', 'ERCOT', 'LZ_AEN', 23.17, 24.375), ('2013-09-05 04:00:00', 'ERCOT', 'LZ_AEN', 22.2, 23.9225), ('2013-09-05 05:00:00', 'ERCOT', 'LZ_AEN', 22.45, 23.9625)]
您可以看到仍然有一些方括号,因为您将列表 values
作为一个整体包含在内(请参阅 .format(values)
)。但是,如果我使用 .format(','.join(str(v) for v in values))
从中构建一个字符串,我会得到以下应该有效的结果:
insert into [dataISO].[dbo].[LMP] (DateTime, ISO, pwrLoc, da, rt) values ('2013-09-05 02:00:00', 'ERCOT', 'LZ_AEN', 24.66, 25.41),('2013-09-05 03:00:00', 'ERCOT', 'LZ_AEN', 23.17, 24.375),('2013-09-05 04:00:00', 'ERCOT', 'LZ_AEN', 22.2, 23.9225),('2013-09-05 05:00:00', 'ERCOT', 'LZ_AEN', 22.45, 23.9625)
错误说字符串太长,可能是这里的插入语句格式不正确。 始终尝试对 SQL 服务器中的字符串使用单引号。
字符串有“[]”,所以也需要格式化。
insert into [dataISO].[dbo].[LMP] (DateTime, ISO, pwrLoc, da, rt) values [('2013-09-05 02:00:00', 'ERCOT LZ_AEN', '24.66', '25.4100'),('2013-09-05 02:00:00', 'ERCOT LZ_AEN', '24.66', '25.4100')]
所以如果我们将代码修改成这样
values = [tuple(row) for row in data]
dateInfoQry = 'insert into [dataISO].[dbo].[LMP] (DateTime, ISO, pwrLoc, da, rt) values {}'.format(','.join(str(s) for s in values))
插入语句看起来还不错。
insert into [dataISO].[dbo].[LMP] (DateTime, ISO, pwrLoc, da, rt) values ('2013-09-05 02:00:00', 'ERCOT', 'LZ_AEN', 4.66, 5.41),('2013-09-05 02:00:00', 'ERCOT', ' LZ_AEN', 24.66, 25.41)
运行良好。
试一试
尝试添加:
设置QUOTED_IDENTIFIER关闭
在您 插入 之前它应该有所帮助,因为 [] 类似于 SQL 中的“”。