Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中使用sqlalchemy在查询中创建sql server表变量_Python_Sql Server_Pandas_Table Variable - Fatal编程技术网

如何在python中使用sqlalchemy在查询中创建sql server表变量

如何在python中使用sqlalchemy在查询中创建sql server表变量,python,sql-server,pandas,table-variable,Python,Sql Server,Pandas,Table Variable,我试图在SQLServer中创建一个表变量,查询它,并将结果返回到一个数据帧(参见示例)。我希望这样做,以便在将数据发送到数据帧之前,可以聚合数据库中的数据。我记得在上设置NOCOUNT将允许它工作,因为它在执行每个查询时不会返回任何内容。但这不起作用。这显然是一个示例代码,但我已经能够在这里重新创建错误。下面的建议链接将为您提供以下信息。我觉得这没有多大帮助 import urllib import sqlalchemy import pandas as pd quoted = urllib

我试图在SQLServer中创建一个表变量,查询它,并将结果返回到一个数据帧(参见示例)。我希望这样做,以便在将数据发送到数据帧之前,可以聚合数据库中的数据。我记得在上设置
NOCOUNT将允许它工作,因为它在执行每个查询时不会返回任何内容。但这不起作用。这显然是一个示例代码,但我已经能够在这里重新创建错误。下面的建议链接将为您提供以下信息。我觉得这没有多大帮助

import urllib
import sqlalchemy
import pandas as pd

quoted = urllib.parse.quote_plus('DRIVER={ODBC Driver 17 for SQL Server};Server=127.0.0.1;Database=mydb;UID=myuser;PWD=mypasswd;Port=1433;')
engine = sqlalchemy.create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted))

query = """
SET NOCOUNT ON;

DECLARE @n_majors TABLE (id varchar(9), n_majors int)

INSERT INTO @n_majors
SELECT m.student_id_fk
, COUNT(DISTINCT dc.category) AS [N majors declared]
FROM msu_db.dbo.Majors AS m
JOIN department_categories AS dc
ON dc.dept_name = m.dept_name
WHERE m.Student_Level_Code = 'UN'
GROUP BY m.student_id_fk

DECLARE @grad_category TABLE (id varchar(9), category varchar(20))

INSERT INTO @grad_category
select m.student_id_fk
, MIN(dc.category)
from Majors AS m
join department_categories as dc
on dc.dept_name = m.dept_name
WHERE m.Student_Level_Code = 'UN'
and graduated = 'CONF'
GROUP BY m.student_id_fk

DECLARE @first_category TABLE (id varchar(9), category varchar(20))

INSERT INTO @first_category
select m.student_id_fk
, MIN(dc.category) as cat
from Majors AS m
join department_categories as dc
on dc.dept_name = m.dept_name
WHERE m.Student_Level_Code = 'UN'
and graduated IS NULL
GROUP BY m.student_id_fk

DECLARE @first_semester_grades TABLE (id varchar(9), avg_grade float, std_grade float, first_Semester_seq_id varchar(4))

INSERT INTO @first_semester_grades
SELECT c.student_id_fk
, AVG(c.Grade) AS [mean grade]
, STDEV(c.Grade) AS [stdev grade]
, MIN(c.Term_Seq_Id) AS Term_Seq_Id
FROM Courses AS c
WHERE c.Student_Level_Code = 'UN'
GROUP BY c.student_id_fk

SET NOCOUNT OFF;

SELECT  s.[student_id_fk]
      ,[gender]
      ,[ethnicity]
      ,[first_course_datetime]
      ,[hs_gpa]
      ,[math_placement_score]
      ,[math_act]
      ,[natsci_act]
      ,COUNT(c.[transfer institution name]) AS [N AP courses]
      , nm.n_majors AS [n-categories]
      , fc.category
      , gc.category AS [grad category]
      , fsg.avg_grade AS first_term_avg
      , fsg.std_grade AS first_term_std
      , fsg.first_Semester_seq_id
  FROM [msu_db].[dbo].[Students] AS s
  LEFT JOIN msu_db.dbo.Courses AS c
  ON s.student_id_fk = c.student_id_fk
  AND c.[transfer institution name] = 'Advanced Placement'

  LEFT JOIN @n_majors as nm
  ON s.student_id_fk = nm.id

  LEFT JOIN @grad_category as gc
  ON s.student_id_fk = gc.id

  LEFT JOIN @first_category AS fc
  ON s.student_id_fk = fc.id

  LEFT JOIN @first_semester_grades AS fsg
  ON s.student_id_fk = fsg.id

  WHERE s.first_course_datetime BETWEEN '1993' AND '2013'

  GROUP BY s.[student_id_fk]
      ,[gender]
      ,[ethnicity]
      ,[first_course_datetime]
      ,[hs_gpa]
      ,[math_placement_score]
      ,[math_act]
      ,[natsci_act]
      , nm.n_majors
      , fc.category
      , gc.category
      , fsg.avg_grade
      , fsg.std_grade
      , fsg.first_Semester_seq_id
    """
pd.read_sql_query(query, engine)
输出的错误消息如下所示:

     --------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
~/anaconda3/envs/research/lib/python3.6/site-packages/sqlalchemy/engine/result.py in _fetchall_impl(self)
   1081         try:
-> 1082             return self.cursor.fetchall()
   1083         except AttributeError:

AttributeError: 'NoneType' object has no attribute 'fetchall'

During handling of the above exception, another exception occurred:

ResourceClosedError                       Traceback (most recent call last)
<ipython-input-3-2a0ea765a8e2> in <module>()
----> 1 df = pd.read_sql_query(query, engine)

~/anaconda3/envs/research/lib/python3.6/site-packages/pandas/io/sql.py in read_sql_query(sql, con, index_col, coerce_float, params, parse_dates, chunksize)
    312     return pandas_sql.read_query(
    313         sql, index_col=index_col, params=params, coerce_float=coerce_float,
--> 314         parse_dates=parse_dates, chunksize=chunksize)
    315 
    316 

~/anaconda3/envs/research/lib/python3.6/site-packages/pandas/io/sql.py in read_query(self, sql, index_col, coerce_float, parse_dates, params, chunksize)
   1070                                         parse_dates=parse_dates)
   1071         else:
-> 1072             data = result.fetchall()
   1073             frame = _wrap_result(data, columns, index_col=index_col,
   1074                                  coerce_float=coerce_float,

~/anaconda3/envs/research/lib/python3.6/site-packages/sqlalchemy/engine/result.py in fetchall(self)
   1135             self.connection._handle_dbapi_exception(
   1136                 e, None, None,
-> 1137                 self.cursor, self.context)
   1138 
   1139     def fetchmany(self, size=None):

~/anaconda3/envs/research/lib/python3.6/site-packages/sqlalchemy/engine/base.py in _handle_dbapi_exception(self, e, statement, parameters, cursor, context)
   1414                 )
   1415             else:
-> 1416                 util.reraise(*exc_info)
   1417 
   1418         finally:

~/anaconda3/envs/research/lib/python3.6/site-packages/sqlalchemy/util/compat.py in reraise(tp, value, tb, cause)
    185         if value.__traceback__ is not tb:
    186             raise value.with_traceback(tb)
--> 187         raise value
    188 
    189 else:

~/anaconda3/envs/research/lib/python3.6/site-packages/sqlalchemy/engine/result.py in fetchall(self)
   1129 
   1130         try:
-> 1131             l = self.process_rows(self._fetchall_impl())
   1132             self._soft_close()
   1133             return l

~/anaconda3/envs/research/lib/python3.6/site-packages/sqlalchemy/engine/result.py in _fetchall_impl(self)
   1082             return self.cursor.fetchall()
   1083         except AttributeError:
-> 1084             return self._non_result([])
   1085 
   1086     def _non_result(self, default):

~/anaconda3/envs/research/lib/python3.6/site-packages/sqlalchemy/engine/result.py in _non_result(self, default)
   1087         if self._metadata is None:
   1088             raise exc.ResourceClosedError(
-> 1089                 "This result object does not return rows. "
   1090                 "It has been closed automatically.",
   1091             )

ResourceClosedError: This result object does not return rows. It has been closed automatically.
--------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
~/anaconda3/envs/research/lib/python3.6/site-packages/sqlalchemy/engine/result.py
1081尝试:
->1082返回self.cursor.fetchall()
1083除属性错误外:
AttributeError:“非类型”对象没有属性“fetchall”
在处理上述异常期间,发生了另一个异常:
ResourceClosedError回溯(最近一次呼叫上次)
在()
---->1 df=pd.read\u sql\u查询(查询,引擎)
读取sql查询中的~/anaconda3/envs/research/lib/python3.6/site-packages/pandas/io/sql.py(sql、con、索引列、强制浮点、参数、解析日期、块大小)
312返回\u sql.read\u查询(
313 sql,索引列=索引列,参数=参数,强制浮点=强制浮点,
-->314解析日期=解析日期,chunksize=chunksize)
315
316
读取查询中的~/anaconda3/envs/research/lib/python3.6/site-packages/pandas/io/sql.py(self、sql、index\u col、强制浮点、解析日期、参数、chunksize)
1070解析_日期=解析_日期)
1071其他:
->1072 data=result.fetchall()
1073帧=换行结果(数据、列、索引列=索引列、,
1074强制浮动=强制浮动,
fetchall(self)中的~/anaconda3/envs/research/lib/python3.6/site-packages/sqlalchemy/engine/result.py
1135自连接。\u句柄\u dbapi\u异常(
1136 e,无,无,
->1137 self.cursor,self.context)
1138
1139 def FETCHTMANY(自身,大小=无):
~/anaconda3/envs/research/lib/python3.6/site-packages/sqlalchemy/engine/base.py in\u handle\u dbapi\u异常(self、e、语句、参数、游标、上下文)
1414                 )
1415其他:
->1416实用程序重新发布(*exc_信息)
1417
1418最后:
~/anaconda3/envs/research/lib/python3.6/site-packages/sqlalchemy/util/compat.py(tp、value、tb、cause)
185如果值._回溯_;不是tb:
186提升值。带回溯(tb)
-->187提高价值
188
189.其他:
fetchall(self)中的~/anaconda3/envs/research/lib/python3.6/site-packages/sqlalchemy/engine/result.py
1129
1130尝试:
->1131 l=self.process\u行(self.\u fetchall\u impl())
1132自软关闭()
1133返回l
~/anaconda3/envs/research/lib/python3.6/site-packages/sqlalchemy/engine/result.py
1082返回self.cursor.fetchall()
1083除属性错误外:
->1084返回自我。非结果([])
1085
1086定义非结果(自身,默认):
~/anaconda3/envs/research/lib/python3.6/site-packages/sqlalchemy/engine/result.py in\u non\u result(self,默认)
1087如果self.\u元数据为无:
1088提升exc.ResourceClosedError(
->1089“此结果对象不返回行。”
1090“它已自动关闭。”,
1091             )
ResourceClosedError:此结果对象不返回行。它已自动关闭。

似乎只要非类型对象通过,它就会失败。我不明白的是为什么首先要传递非类型对象。不应该传递查询结果吗?

您在变量声明中拼错了表-它有一个1而不是一个l。如果你认为应该起作用的东西不起作用,首先检查你的假设

更新:

import urllib
import sqlalchemy
import pandas as pd

quoted = urllib.parse.quote_plus('DRIVER={ODBC Driver 17 for SQL Server};Server=127.0.0.1;Database=mydb;UID=myuser;PWD=mypasswd;Port=1433;')
engine = sqlalchemy.create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted))

query = """
SET NOCOUNT ON
DECLARE @table TABLE (id int, value float)
INSERT INTO @table VALUES (1, 2.7)
INSERT INTO @table VALUES (2, 4.5)
INSERT INTO @table VALUES (3, 1.2)

SELECT * FROM @table
"""
pd.read_sql_query(query, engine)

您在变量声明中拼错了表-它有一个1而不是一个l。如果你认为应该起作用的东西不起作用,首先检查你的假设

更新:

import urllib
import sqlalchemy
import pandas as pd

quoted = urllib.parse.quote_plus('DRIVER={ODBC Driver 17 for SQL Server};Server=127.0.0.1;Database=mydb;UID=myuser;PWD=mypasswd;Port=1433;')
engine = sqlalchemy.create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted))

query = """
SET NOCOUNT ON
DECLARE @table TABLE (id int, value float)
INSERT INTO @table VALUES (1, 2.7)
INSERT INTO @table VALUES (2, 4.5)
INSERT INTO @table VALUES (3, 1.2)

SELECT * FROM @table
"""
pd.read_sql_query(query, engine)

对于要从SQL Server返回的受影响的正确行消息,在返回查询结果之前,必须关闭NOCOUNT back:

import urllib
import sqlalchemy
import pandas as pd

quoted = urllib.parse.quote_plus('DRIVER={ODBC Driver 17 for SQL Server};Server=127.0.0.1;Database=mydb;UID=myuser;PWD=mypasswd;Port=1433;')
engine = sqlalchemy.create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted))

query = """
SET NOCOUNT ON
DECLARE @table TABLE (id int, value float)
INSERT INTO @table VALUES (1, 2.7)
INSERT INTO @table VALUES (2, 4.5)
INSERT INTO @table VALUES (3, 1.2)

SET NOCOUNT OFF
SELECT * FROM @table
"""
pd.read_sql_query(query, engine)

对于要从SQL Server返回的受影响的正确行消息,在返回查询结果之前,必须关闭NOCOUNT back:

import urllib
import sqlalchemy
import pandas as pd

quoted = urllib.parse.quote_plus('DRIVER={ODBC Driver 17 for SQL Server};Server=127.0.0.1;Database=mydb;UID=myuser;PWD=mypasswd;Port=1433;')
engine = sqlalchemy.create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted))

query = """
SET NOCOUNT ON
DECLARE @table TABLE (id int, value float)
INSERT INTO @table VALUES (1, 2.7)
INSERT INTO @table VALUES (2, 4.5)
INSERT INTO @table VALUES (3, 1.2)

SET NOCOUNT OFF
SELECT * FROM @table
"""
pd.read_sql_query(query, engine)

虽然这在我创建的示例中解决了问题,但在我编写的实际代码中并没有解决问题。我在原始问题中添加了实际代码,以提供更多细节,因为我的示例问题不够复杂。虽然这修复了我创建的示例中的问题,但它并没有修复我编写的实际代码中的问题。由于示例问题不够复杂,我将实际代码添加到原始问题以提供更多详细信息。由于示例问题太简单,我更新了原始问题以获得原始代码。由于示例问题太简单,我更新了原始问题以获得原始代码。