使用python3,我可以使用pymysql连接到mysql。一切都按预期进行。所附代码有效。
import pymysql
conn = pymysql.connect(host='127.0.0.1', unix_socket='/home/jhgong/mysql/tmp/mysql.sock', user='root', passwd='my_pass', db='my_db', port='3333')
cur = conn.cursor()
cur.execute('select user from auth_users')
for i in cur:
print(i)
Run Code Online (Sandbox Code Playgroud)
试图让 sqlalchemy 与 pymysql 连接,默认示例字符串似乎不起作用。除非我声明端口号和 unix_socket,否则上面的示例不起作用。
下面是我一直用来尝试连接 sqlalchemy 的内容。我假设套接字和端口号都是需要的。我使用 connect_args 来提供带有额外 unix_socket 位置的哈希值。没有喜悦。
附上我一直在使用的产生错误的片段。
conarg = {
'unix_socket':'/home/jhgong/mysql/tmp/mysql.sock',
'db' :'ice'
}
engine = create_engine('mysql+pymysql://root:my_pass@127.0.0.1:3333/my_db', connect_args = conarg, echo=True)
connection = engine.connect()
Run Code Online (Sandbox Code Playgroud)
无论有或没有 conarg 哈希中的数据库,我都会收到以下错误:
>>> connection = engine.connect()
2013-01-17 13:04:20,819 INFO sqlalchemy.engine.base.Engine b'SELECT DATABASE()'
2013-01-17 13:04:20,819 INFO sqlalchemy.engine.base.Engine ()
Traceback (most recent call last):
File "/nfs/site/home/jhgongx/.local/lib/python3.2/site-packages/SQLAlchemy-0.8.0b1dev-py3.2.egg/sqlalchemy/pool.py", line …Run Code Online (Sandbox Code Playgroud) 我想编写一个生成器函数,该函数将在内存有限的系统上运行,该系统使用 PyMySql(或 MySQLDb)一次返回一个选择查询的结果。以下作品:
#execute a select query and return results as a generator
def SQLSelectGenerator(self,stmt):
#error handling code removed
cur.execute(stmt)
row = ""
while row is not None:
row = self.cur.fetchone()
yield row
Run Code Online (Sandbox Code Playgroud)
然而,以下内容似乎也有效,但它是否正在执行 fetchall() 是神秘的。我在 Python DB API 中找不到当您将游标对象作为列表进行迭代时到底会发生什么:
#execute a select query and return results as a generator
def SQLSelectGenerator(self,stmt):
#error handling code removed
cur.execute(stmt)
for row in self.cur:
yield row
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,以下内容都会成功打印所有行
stmt = "select * from ..."
for l in SQLSelectGenerator(stmt):
print(l)
Run Code Online (Sandbox Code Playgroud)
所以我想知道第二种实现是更好还是更差,以及它是调用 fetchall 还是用 fetchone 做一些棘手的事情。Fetchall …
我正在尝试创建一个多脚本工具,它将采用 .sql 文件的参数并执行它。
我已经设置了一个简单的测试,仅在一个数据库上执行,但是语法每次都会给我带来问题。
DELIMITER $$
CREATE DEFINER=`a_user`@`%` PROCEDURE `a_procedure`(
IN DirectEmployeeID TEXT,
IN StartRange DATE,
IN EndRange DATE
)
BEGIN
SELECT aColumn
WHERE thisThing = 1;
END$$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
需要明确的是,该脚本已经过测试,并且在通过时可以正常工作,如下所示:
mysql -uuser -p -hhost -Pport databaseName < file.sql
Run Code Online (Sandbox Code Playgroud)
也可以通过 mysql 工作台工作。
我在另一个网站上看到了这种类型的解决方案:
with conn.cursor() as cursor:
f = sys.argv[1]
file = open(f, 'r')
sql = " ".join(file.readlines())
cursor.execute(sql)
Run Code Online (Sandbox Code Playgroud)
这给了我一个 MySQL 语法错误:
pymysql.err.ProgrammingError: (1064, u"You have an error in your SQL syntax;
check the manual that corresponds to your MySQL …Run Code Online (Sandbox Code Playgroud) 我有一个队列数据结构,其中多个线程消耗项目,每个线程将使用 PyMySQL 写入数据库,线程之间不需要其他同步。
在所有线程中使用来自同一个 pymysql 连接的同一个游标是否可以自由竞争?
来自同一连接的每个线程使用不同的游标是否可以自由竞争?
(当然在多线程中使用多个连接是可以的,因为在这种情况下没有共享资源,我对这种情况没有兴趣)
lst = [{'Fruit':'Apple','HadToday':2},{'Fruit':'Banana','HadToday':8}]
Run Code Online (Sandbox Code Playgroud)
我有一长串上述形式的词典。
我有两个固定变量。
person = 'Sam'
date = datetime.datetime.now()
Run Code Online (Sandbox Code Playgroud)
我希望将此信息插入到表格中mysql。
我目前是怎么做的
for item in lst:
item['Person'] = person
item['Date'] = date
cursor.executemany("""
INSERT INTO myTable (Person,Date,Fruit,HadToday)
VALUES (%(Person)s, %(Date)s, %(Fruit)s, %(HadToday)s)""", lst)
conn.commit()
Run Code Online (Sandbox Code Playgroud)
他们的方法是绕过循环,因为人员和日期变量是恒定的。我努力了
lst = [{'Fruit':'Apple','HadToday':2},{'Fruit':'Banana','HadToday':8}]
cursor.executemany("""
INSERT INTO myTable (Person,Date,Fruit,HadToday)
VALUES (%s, %s, %(Fruit)s, %(HadToday)s)""", (person,date,lst))
conn.commit()
Run Code Online (Sandbox Code Playgroud)
类型错误:格式字符串参数不足
我目前在我的应用程序中使用 Flask-login 进行用户登录会话管理。我正在使用flask-sqlalchemy,所以一切正常。由于我之前的 sql 经验,我不是 ORM 的粉丝。我喜欢直接使用SQL。可能是因为我对 ORM 的了解不深。无论如何,我的问题是 - 有没有什么方法可以在没有 ORM/flask-sqlalchemy 的情况下使用烧瓶登录,在那里我通过 pymysql 或 MySQL 连接器获取用户数据?
我知道我可以自己创建会话并在我注销时弹出,但我想知道是否有任何方法可以将flask-login或任何其他会话管理库与pymysql一起使用?
我的数据库如下所示:
CREATE TABLE my_table( irrelevant_column TEXT, json_stuff JSON );
Run Code Online (Sandbox Code Playgroud)
mysql> SELECT * FROM my_table;
+------------------------+-----------------------------------------------+
| irrelevant_column | json_stuff |
+------------------------+-----------------------------------------------+
| blah blah | { 'this': 'is my json data' } |
| more unrelated stuff | { 'more': 'of my data in the correct format' }|
+------------------------+-----------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种优雅的方法来将 MySQL 中的 JSON 数据查询到字典列表中。
我尝试过使用DictCursor
cursor = connection.cursor( pymysql.cursors.DictCursor )
cursor.execute( "SELECT json_stuff FROM my_table" )
rows = cursor.fetchall()
Run Code Online (Sandbox Code Playgroud)
但它不能正确处理 JSON 列类型。它返回这个:
[
{ "json_stuff": "<json_stuff row 1 in …Run Code Online (Sandbox Code Playgroud) 我的程序执行 SQL 插入时一直遇到一个奇怪的问题。我定期(每天一次)在单个 INSERT 语句中使用 pymysql 发送大量数据,每隔几天我就会收到以下错误:
(sqlalchemy.exc.InvalidRequestError) A value is required for bind parameter 'D' [SQL:
在我的代码中,这是数据库连接和插入完成的方式:
会话创建:
engine = sqlalchemy.create_engine(db_host, echo = False)
self.metadata = sqlalchemy.MetaData(engine)
DB_session = sqlalchemy.orm.sessionmaker(bind = engine)
session = DB_session()
Run Code Online (Sandbox Code Playgroud)
插入功能:
def insert(self,sql):
complete = False
try:
self.session.execute(sql)
self.session.commit()
complete = True
except Exception as e:
# Do some logging
finally:
return complete
Run Code Online (Sandbox Code Playgroud)
典型的插入语句如下所示:
INSERT INTO my_db.my_table (field_1, field_2, field_3, ... field_32)
VALUES(data_set1),(data_set2),(data_set3)...(data_set500)
ON DUPLICATE KEY UPDATE
field_1=VALUES(field_1), field_2=VALUES(field_2), field_3=VALUES(field_3) ... field_32=VALUES(field_32)
Run Code Online (Sandbox Code Playgroud)
我查过这个问题,通常情况下,当用户显式设置绑定参数并且缺少一个参数时,似乎会发生这种情况,但我不明白为什么我的代码会发生这种情况,而我没有设置任何参数,而且我没有字段说出“D”的名称或知道“D”指的是什么。另外,更令人困惑的是,当我将完全相同的语句插入 MySQL …
当我使用Pymysql连接Mysql数据库并创建SScursor来查询一个返回大约60万条数据的存储过程并每次返回一天处理该数据时,代码如下:
def get_citatorlni_gen(self):
con = pymysql.connect(user=self.user, password=self.password, database=self.database,
host=self.host, port=self.port)
cur = con.cursor(pymysql.cursors.SSCursor)
try:
cur.callproc('users_balance')
while True:
row = cur.read_next()
if not row:
break
yield row[0]
except Exception:
raise
finally:
cur.close()
con.close()
Run Code Online (Sandbox Code Playgroud)
处理存储过程返回以下数据:
def chunk_gen(self):
user_balance = self.users_balance()
for count, item in enumerate(user_balance, 1):
if count % 100 == 0:
time.sleep(5) # Each batch takes about 5 seconds to process
else:
time.sleep(5)
Run Code Online (Sandbox Code Playgroud)
每次大约10分钟后,出现以下错误
File "/user/src/app/controller.py", line 54, in users_balance
row = cur.read_next()
File "/home/.local/lib/python3.6/site-packages/pymysql/cursors.py", line 464, in read_next
return self._conv_row(self._result._read_rowdata_packet_unbuffered()) …Run Code Online (Sandbox Code Playgroud) 在 jupyter 笔记本中导入 pymysql 后出现以下错误。请帮我找出错误。
import pymysql
print("Welcome")
ModuleNotFoundError
<ipython-input-5-7978bc79cc40> in <module>()
1 import pymysql
2 print("Here")
ModuleNotFoundError: No module named 'pymysql'
Run Code Online (Sandbox Code Playgroud) pymysql ×10
python ×8
mysql ×5
python-3.x ×2
sqlalchemy ×2
flask ×1
flask-login ×1
json ×1
mysql-python ×1
pip ×1
python-2.7 ×1