When django connects directly to PG, execute python manage.py migrate and everything works fine. But when django adds shardingsphere-proxy, executing command return an error
environment:
- Django 3.2.12
- psycopg2-binary 2.8.6
- psycopg2-binary 2.8.6
- apache/shardingsphere-proxy 5.4.1
- postgres 11.14
exception detail:
Traceback (most recent call last):
File "/data/code/dtmg/.env/lib/python3.9/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
self.connect()
File "/data/code/dtmg/.env/lib/python3.9/site-packages/django/utils/asyncio.py", line 33, in inner
return func(*args, **kwargs)
File "/data/code/dtmg/.env/lib/python3.9/site-packages/django/db/backends/base/base.py", line 202, in connect
self.init_connection_state()
File "/data/code/dtmg/.env/lib/python3.9/site-packages/django/db/backends/postgresql/base.py", line 224, in init_connection_state
timezone_changed = self.ensure_timezone()
File "/data/code/dtmg/.env/lib/python3.9/site-packages/django/db/backends/postgresql/base.py", line 217, in ensure_timezone
cursor.execute(self.ops.set_time_zone_sql(), [timezone_name])
psycopg2.errors.SystemError: Unknown exception: null
PG timezone is Asia/Shanghai shardingsphere-proxy timezone is Etc/UTC
sharding_db=> show time zone;
timezone
----------
Etc/UTC
(1 row)
and in ensure_timezone function:
def ensure_timezone(self):
if self.connection is None:
return False
# conn_timezone_name = None
conn_timezone_name = self.connection.get_parameter_status('TimeZone')
timezone_name = self.timezone_name
if timezone_name and conn_timezone_name != timezone_name:
with self.connection.cursor() as cursor:
cursor.execute(self.ops.set_time_zone_sql(), [timezone_name])
return True
return False
conn_timezone_name = None sharding-proxy log:
dev_shardingsphere-proxy | [ERROR] 2023-11-04 16:37:22.657 [ShardingSphere-Command-28] o.a.s.p.f.c.CommandExecutorTask - Exception occur:
dev_shardingsphere-proxy | java.util.NoSuchElementException: null
dev_shardingsphere-proxy | at java.base/java.util.LinkedList$ListItr.next(LinkedList.java:894)
dev_shardingsphere-proxy | at org.apache.shardingsphere.proxy.backend.postgresql.handler.admin.executor.PostgreSQLSetVariableAdminExecutor.execute(PostgreSQLSetVariableAdminExecutor.java:42)
dev_shardingsphere-proxy | at org.apache.shardingsphere.proxy.backend.handler.admin.DatabaseAdminUpdateBackendHandler.execute(DatabaseAdminUpdateBackendHandler.java:44)
dev_shardingsphere-proxy | at org.apache.shardingsphere.proxy.frontend.postgresql.command.query.simple.PostgreSQLComQueryExecutor.execute(PostgreSQLComQueryExecutor.java:77)
dev_shardingsphere-proxy | at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.doExecuteCommand(CommandExecutorTask.java:126)
dev_shardingsphere-proxy | at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.executeCommand(CommandExecutorTask.java:121)
dev_shardingsphere-proxy | at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.run(CommandExecutorTask.java:78)
dev_shardingsphere-proxy | at com.alibaba.ttl.TtlRunnable.run(TtlRunnable.java:60)
dev_shardingsphere-proxy | at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
dev_shardingsphere-proxy | at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
dev_shardingsphere-proxy | at java.base/java.lang.Thread.run(Thread.java:833)
dev_shardingsphere-proxy | [ERROR] 2023-11-04 17:06:29.105 [ShardingSphere-Command-32] o.a.s.p.f.c.CommandExecutorTask - Exception occur:
dev_shardingsphere-proxy | java.util.NoSuchElementException: null
dev_shardingsphere-proxy | at java.base/java.util.LinkedList$ListItr.next(LinkedList.java:894)
dev_shardingsphere-proxy | at org.apache.shardingsphere.proxy.backend.postgresql.handler.admin.executor.PostgreSQLSetVariableAdminExecutor.execute(PostgreSQLSetVariableAdminExecutor.java:42)
dev_shardingsphere-proxy | at org.apache.shardingsphere.proxy.backend.handler.admin.DatabaseAdminUpdateBackendHandler.execute(DatabaseAdminUpdateBackendHandler.java:44)
dev_shardingsphere-proxy | at org.apache.shardingsphere.proxy.frontend.postgresql.command.query.simple.PostgreSQLComQueryExecutor.execute(PostgreSQLComQueryExecutor.java:77)
dev_shardingsphere-proxy | at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.doExecuteCommand(CommandExecutorTask.java:126)
dev_shardingsphere-proxy | at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.executeCommand(CommandExecutorTask.java:121)
dev_shardingsphere-proxy | at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.run(CommandExecutorTask.java:78)
dev_shardingsphere-proxy | at com.alibaba.ttl.TtlRunnable.run(TtlRunnable.java:60)
dev_shardingsphere-proxy | at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
dev_shardingsphere-proxy | at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
dev_shardingsphere-proxy | at java.base/java.lang.Thread.run(Thread.java:833)
I try django connect pg directly,then everything is ok.
My business scenario has hundreds of millions or billions of pieces of data in a single table of records, so I need to use middleware to handle the sub-database sub-table, but when I add sharding-proxy, it doesn't work I can't find a solution. If anyone can help, thank you very much