一年多以前,有人问过这个问题:执行.sql文件,用于在python中的SQL Management Studio中运行.
我正在python中编写一个连接到SQL服务器的脚本,并根据大(几GB).sql文件中的SQL命令创建和填充数据库.
看起来SQLCMD需要下载并安装SQL Server Express.有没有其他方法从python执行.sql文件,而不需要使用我的脚本的每个人下载和安装SQL Server?pyodbc有这种能力吗?
编辑:
这是另一个类似的问题: 使用python MySQLdb执行*.sql文件
在这里,解决方案是从命令(在本例中为mysql.exe)调用实用程序,并将该文件作为参数列出.
在我看来应该有一种方法来使用Python的DB API库之一,但我还没有找到它所以我正在寻找像我可以用来运行文件的SQLCMD或MYSQL这样的*.exe从命令行.
PS如果我没有正确地看这个,请随时纠正我.也许下面的代码与从命令行运行一样有效:
for line in open('query.sql','r'):
cursor.execute(line)
Run Code Online (Sandbox Code Playgroud) 我经常收到这个错误: ProgrammingError: The cursor's connection has been closed.
在尝试执行查询之前,有没有办法检查我正在使用的连接是否已关闭?
我正在考虑编写一个包装器来执行查询.首先,它将检查连接是否关闭,如果是,它将重新连接.这是一种可行的方法吗?
我有一个postgresql数据库,其中包含drupal制作的一些表格,以及我自己制作的其他表格.然后我有一个使用pyodbc的python api来查询数据库.
只有一个表,我无法通过pyodbc选择.如果我打印查询并将其粘贴到pgadminIII中,那么它会给出预期的结果,如果我在python代码中更改了表,它会给出正确的结果.
查询是
select id from a_company where name = 'somename'
Run Code Online (Sandbox Code Playgroud)
结果
7
8
9
Run Code Online (Sandbox Code Playgroud)
等(50行int id)
我的python代码是
sql = """select id from a_company where name = 'somename'"""
curs = self._connection.cursor()
sql = self._ConvertToPostGres(sql) #drops [] etc, as the initial code was for MSSQL
curs.execute(sql)
f = curs.fetchall()
Run Code Online (Sandbox Code Playgroud)
通过pyodbc的调用返回
None
Run Code Online (Sandbox Code Playgroud)
(我可以使用相同的连接从其他表中进行选择,因此连接字符串无关紧要?)
我最好的猜测是这是一个权限问题,而且我已经用这个特定的表做了一些蠢事.
任何人都可以建议如何调试这个?
通过pgadmin创建表:
-- Table: a_company
-- DROP TABLE a_company;
CREATE TABLE a_company
(
id integer NOT NULL DEFAULT nextval('a_company_id_seq'::regclass),
name character varying,
abn character varying,
url character …Run Code Online (Sandbox Code Playgroud) 我有一个Python程序,使用ODBC连接连接到MSSQL数据库.我正在使用的Python库是pypyodbc.
这是我的设置:
我遇到的问题是,当我查询带有varchar(max)列的表时,内容被截断.
我是pypyodbc的新手,我一直在疯狂地搜索,并且找不到任何关于如何防止在pypyodbc甚至pyodbc中发生这种情况的事情.至少没有我一直在使用的搜索词,我不知道还有什么其他的短语可以尝试.
我甚至尝试添加SET TEXTSIZE 2147483647;到我的SQL查询,但数据仍然被截断.
我该如何防止这种情况发生?或者,你能指出我正确的方向吗?
更新:
所以,我尝试在我的SQL查询中执行强制转换.当我这样做CAST(my_column as VARCHAR(MAX))时截断在相同的位置.但是,如果我这样做CAST(my_column as VARCHAR(8000))会给我一个更大的文本集,但它仍然会截断一些内容.如果我尝试做任何比8000我更大的错误,说8000我是最大的,我可以使用.有人知道这里会发生什么吗?使用MAX不起作用似乎很奇怪.
我来自 R,但由于各种原因需要在 Python 中执行此操作。这很可能是我的 Python 的基本 PEBKAC 问题,而不是 Pandas、PyODBC 或其他任何东西。
请多多包涵。
我当前的 Python 3 代码:
import pandas as pd
import pyodbc
cnxn = pyodbc.connect(DSN="databasename", uid = "username", pwd = "password")
querystring = 'select order_number, creation_date from table_name where order_number = ?'
orders = ['1234',
'2345',
'3456',
'5678']
for i in orders:
print(pd.read_sql(querystring, cnxn, params = [i]))
Run Code Online (Sandbox Code Playgroud)
我需要的是一个列名为“order_number”和“creation_date”的数据框。
抱歉截屏,无法在此处获取格式。
阅读dataframe.append page 后,我尝试了这个:
df = pd.DataFrame()
for i in orders:
df.append(pd.read_sql(querystring, cnxn, params = [i]))
Run Code Online (Sandbox Code Playgroud)
这似乎运行良好(无论如何都没有抛出错误)。
但是当我尝试输出 df 时,我得到 …
我正在尝试将Pandas的DataFrame写入SQL Server表.这是我的例子:
import pyodbc
import pandas as pd
import sqlalchemy
df = pd.DataFrame({'MDN': [242342342] })
engine = sqlalchemy.create_engine('mssql://localhost/Sandbox?trusted_connection=yes')
df.to_sql('Test',engine, if_exists = 'append',index = False)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息.有关如何修复的任何想法?
c:\python34\lib\site-packages\sqlalchemy\connectors\pyodbc.py:82: SAWarning: No driver name specified; this is expected by PyODBC when using DSN-less connections
"No driver name specified; "
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-25-78677a18ce2d> in <module>()
4 engine = sqlalchemy.create_engine('mssql://localhost/Sandbox?trusted_connection=yes')
5
----> 6 df.to_sql('Test',engine, if_exists = 'append',index = False)
7
8 #cnxn.close()
c:\python34\lib\site-packages\pandas\core\generic.py in to_sql(self, name, con, flavor, schema, if_exists, index, …Run Code Online (Sandbox Code Playgroud) 我尝试将一堆数据插入数据库
insert_list = [(1,1,1,1,1,1),(2,2,2,2,2,2),(3,3,3,3,3,3),....] #up to 10000 tuples in this list
conn = pyodbc.connect('DRIVER={FreeTDS};SERVER=xxxxx;DATABASE=xxxx;UID=xx;PWD=xx;TDS_Version=7.0')
cursor = conn.cursor()
sql = "insert into ScanEMAxEMAHistoryDay(SecurityNumber, EMA1, EMA2, CrossType, DayCross, IsLocalMinMax) values (?, ?, ?, ?, ?, ?)"
cursor.executemany(sql, insert_list)
Run Code Online (Sandbox Code Playgroud)
cursor.executemany(sql,insert_list)
pyodbc.ProgrammingError:('参数类型无效.param-index = 4 param-type = numpy.int64','HY105')
减少到100元组:
cursor.executemany(sql, insert_list[:100])
Run Code Online (Sandbox Code Playgroud)
cursor.executemany(sql,insert_list [:100])
pyodbc.ProgrammingError:('参数类型无效.param-index = 4 param-type = numpy.int64','HY105')cursor.executemany(sql,insert_list [:100])
减少到5元组:
cursor.executemany(sql, insert_list[:5])
conn.commit()
Run Code Online (Sandbox Code Playgroud)
这可以插入数据库
我试着:
sql = 'SET GLOBAL max_allowed_packet=50*1024*1024'
cursor.execute(sql)
Run Code Online (Sandbox Code Playgroud)
在excutemany()之前,它有一个错误:
pyodbc.ProgrammingError:('42000',"[42000] [FreeTDS] [SQL Server]'GLOBAL'不是公认的SET选项.(195)(SQLExecDirectW)")
我是怎么解决这个问题的
谢谢.
我使用的是Python 3.6,pyodbc,并连接到SQL Server.
我正在尝试连接到数据库,然后创建带参数的查询.
这是代码:
import sys
import pyodbc
# connection parameters
nHost = 'host'
nBase = 'base'
nUser = 'user'
nPasw = 'pass'
# make connection start
def sqlconnect(nHost,nBase,nUser,nPasw):
try:
return pyodbc.connect('DRIVER={SQL Server};SERVER='+nHost+';DATABASE='+nBase+';UID='+nUser+';PWD='+nPasw)
print("connection successfull")
except:
print ("connection failed check authorization parameters")
con = sqlconnect(nHost,nBase,nUser,nPasw)
cursor = con.cursor()
# make connection stop
# if run WITHOUT parameters THEN everything is OK
ask = input ('Go WITHOUT parameters y/n ?')
if ask == 'y':
# SQL without parameters start
res …Run Code Online (Sandbox Code Playgroud) 我试图运行一个选择查询来使用pyodbcpython 2.7 从SQL Server检索数据.我希望数据在列表中返回.我写的代码如下.
它有点工作,但不符合我的预期.我的返回列表如下所示:
Index Type Size Value
0 Row 1 Row object of pyodbc module
1 Row 1 Row object of pyodbc module
...
105 Row 1 Row object of pyodbc module
Run Code Online (Sandbox Code Playgroud)
我希望看到类似下面的内容(即我在SQL中的表)
ActionId AnnDate Name SaleValue
128929 2018-01-01 Bob 105.3
193329 2018-04-05 Bob 1006.98
...
23654 2018-11-21 Bob 103.32
Run Code Online (Sandbox Code Playgroud)
列表不是使用SQL查询返回数据的最佳方法pyodbc吗?
码
import pyodbc
def GetSQLData(dbName, query):
sPass = 'MyPassword'
sServer = 'MyServer\\SQL1'
uname = 'MyUser'
cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
"Server=" …Run Code Online (Sandbox Code Playgroud) 我正在使用一个Linux consumption计划.
我收到以下错误;
Exception: ModuleNotFoundError: No module named 'pyodbc'
我已经pyodbc在requirements.txt文件中添加了这个文件中的其他模块,比如azure-storage工作正常.
有没有人看过这个问题或者可以证实这是一个已知的bug?我看不到任何手动安装它的方法.
pyodbc ×10
python ×10
sql-server ×4
pandas ×2
sql ×2
dataframe ×1
freetds ×1
list ×1
markers ×1
mysql ×1
numpy ×1
odbc ×1
postgresql ×1
pypyodbc ×1
python-2.7 ×1
sqlalchemy ×1